Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

cách cross-dbms để kiểm tra xem chuỗi có phải là số không

Dưới đây là ba cách triển khai riêng biệt cho từng SQL Server, MySQL và Oracle. Không có cách nào sử dụng (hoặc có thể) cùng một cách tiếp cận, vì vậy dường như không có cách DBMS chéo để thực hiện điều đó. Đối với MySQL và Oracle, chỉ có thử nghiệm số nguyên đơn giản được hiển thị; đối với SQL Server, kiểm tra số đầy đủ được hiển thị.

Đối với SQL Server: lưu ý rằng isnumeric ('.') Trả về 1 .. nhưng nó thực sự không thể được chuyển đổi thành float. Một số văn bản như '1e6' không thể được chuyển đổi trực tiếp thành số, nhưng bạn có thể chuyển qua float, sau đó là số.

;with tmp(x) as (
    select 'db01' union all select '1' union all select '1e2' union all
    select '1234' union all select '' union all select null union all
    select '1.2e4' union all select '1.e10' union all select '0' union all
    select '1.2e+4' union all select '1.e-10' union all select '1e--5' union all
    select '.' union all select '.123' union all select '1.1.23' union all
    select '-.123' union all select '-1.123' union all select '--1' union all
    select '---1.1' union all select '+1.123' union all select '++3' union all
    select '-+1.123' union all select '1 1' union all select '1e1.3' union all
    select '1.234' union all select 'e4' union all select '+.123' union all
    select '1-' union all select '-3e-4' union all select '+3e-4'  union all
    select '+3e+4' union all select '-3.2e+4' union all select '1e1e1' union all
    select '-1e-1-1')

select x, isnumeric(x),
    case when x not like '%[^0-9]%' and x >'' then convert(int, x) end as SimpleInt,
    case
    when x is null or x = '' then null -- blanks
    when x like '%[^0-9e.+-]%' then null -- non valid char found
    when x like 'e%' or x like '%e%[e.]%' then null -- e cannot be first, and cannot be followed by e/.
    when x like '%e%_%[+-]%' then null -- nothing must come between e and +/-
    when x='.' or x like '%.%.%' then null -- no more than one decimal, and not the decimal alone
    when x like '%[^e][+-]%' then null -- no more than one of either +/-, and it must be at the start
    when x like '%[+-]%[+-]%' and not x like '%[+-]%e[+-]%' then null
    else convert(float,x)
    end
from tmp order by 2, 3

Đối với MySQL

create table tmp(x varchar(100));
insert into tmp
    select 'db01' union all select '1' union all select '1e2' union all
    select '1234' union all select '' union all select null union all
    select '1.2e4' union all select '1.e10' union all select '0' union all
    select '1.2e+4' union all select '1.e-10' union all select '1e--5' union all
    select '.' union all select '.123' union all select '1.1.23' union all
    select '-.123' union all select '-1.123' union all select '--1' union all
    select '---1.1' union all select '+1.123' union all select '++3' union all
    select '-+1.123' union all select '1 1' union all select '1e1.3' union all
    select '1.234' union all select 'e4' union all select '+.123' union all
    select '1-' union all select '-3e-4' union all select '+3e-4'  union all
    select '+3e+4' union all select '-3.2e+4' union all select '1e1e1' union all
    select '-1e-1-1';

select x,
    case when x not regexp('[^0-9]') then x*1 end as SimpleInt
from tmp order by 2

Đối với Oracle

case when REGEXP_LIKE(col, '[^0-9]') then col*1 end



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập dữ liệu đệm vào biểu mẫu trực tuyến trong trường hợp ngắt kết nối (Vợt)

  2. PDO Chèn mảng sử dụng khóa làm tên cột

  3. Tìm kiếm trực tiếp với PHP AJAX và XML

  4. Lỗi cú pháp SQL 1064

  5. cách tạo select lồng nhau trên zend db