我必須測驗 sql 表的一列是否存在無效值和 NULL。
有效值為:任何數字和字串“nv”(帶有和不帶有點以及在我的 sql 命令中列出的每種可能的組合)
到目前為止,我已經嘗試過這個:
select count(*)
from table1
where column1 is null
or not REGEXP_LIKE(column1, '^[0-9,nv,Nv,nV,NV,n.v,N.v,n.V,N.V] $');
正則運算式還匹配單個字符值 'n'、'N'、'v'、'V'(帶有和不帶有后跟點)。這不應該是這種情況,因為我只希望匹配 sql 命令中寫入的確切字符組合。我想問題與使用 REGEXP_LIKE 有關。有任何想法嗎?
uj5u.com熱心網友回復:
我想這個正則運算式會起作用:
NOT REGEXP_LIKE(column1, '^([0-9] |n\.?v\.?)$', 'i')
請注意,,不是分隔符,.表示任何字符,\.表示點字符本身和'i'標志可用于忽略大小寫,而不是硬編碼大小寫字符的所有組合。
uj5u.com熱心網友回復:
無需使用regexp(性能會因大資料而增加)- 簡單的舊版TRANSLATE足以進行驗證。
請注意,首先translate(column1,'x0123456789','x')從字串中洗掉所有數字字符,因此如果以null字串結尾就可以了。
第二個從降低的字串中translate(lower(column1),'x.','x')洗掉所有點,以便您期望結果。為了避免情況,因為您還限制了字串長度。nvn.....v....
select
column1,
case when
translate(column1,'x0123456789','x') is null or /* numeric string */
translate(lower(column1),'x.','x') = 'nv' and length(column1) <= 4 then 'OK'
end as status
from table1
COLUMN1 STATUS
--------- ------
1010101 OK
1012828n
1012828nv
n.....v....
n.V OK
測驗資料
create table table1 as
select '1010101' column1 from dual union all -- OK numbers
select '1012828n' from dual union all -- invalid
select '1012828nv' from dual union all -- invalid
select 'n.....v....' from dual union all -- invalid
select 'n.V' from dual; -- OK nv
uj5u.com熱心網友回復:
您可以使用:
select count(*)
from table1
WHERE TRANSLATE(column1, ' 0123456789', ' ') IS NULL
OR LOWER(column1) IN ('nv', 'n.v', 'nv.', 'n.v.');
其中,對于樣本資料:
CREATE TABLE table1 (column1) AS
SELECT '12345' FROM DUAL UNION ALL
SELECT 'nv' FROM DUAL UNION ALL
SELECT 'NV' FROM DUAL UNION ALL
SELECT 'nV' FROM DUAL UNION ALL
SELECT 'n.V.' FROM DUAL UNION ALL
SELECT '...................n.V.....................' FROM DUAL UNION ALL
SELECT '..nV' FROM DUAL UNION ALL
SELECT 'n..V' FROM DUAL UNION ALL
SELECT 'nV..' FROM DUAL UNION ALL
SELECT 'xyz' FROM DUAL UNION ALL
SELECT '123nv' FROM DUAL;
輸出:
數數(*) 5
或者,如果您想要任何數量的.then:
select count(*)
from table1
WHERE TRANSLATE(column1, ' 0123456789', ' ') IS NULL
OR REPLACE(LOWER(column1), '.') = 'nv';
哪些輸出:
數數(*) 9
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371598.html
