SQL Server 2016:数字通配符 [^0-9] - 过滤掉 0000

SQL Server 2016: Numbers Wildcard [^0-9] - filter out 0000

我在 4 个字符的字段中使用通配符来过滤掉非数字值,这工作正常,但我还想过滤掉“0000”值。是否可以 w/o 使用 'AND/OR'?

DECLARE @D VARCHAR(4) = '0000'

SELECT  
    (CASE
        WHEN @D NOT LIKE '%[^0-9]%' 
           THEN CONVERT(INT, LEFT(@D, 2))
           ELSE NULL 
     END)

添加带有 AND 的额外参数。

DECLARE @D VARCHAR(4) = '0000'

SELECT (CASE WHEN @D NOT LIKE '%[^0-9]%' AND @D != '0000' 
         THEN CONVERT(INT, LEFT(@D, 2))
         ELSE NULL END)

工作示例。

SELECT CASE WHEN yourfield NOT LIKE '%[^0-9]%' AND yourfield != '0000' 
       THEN 'xxx'
       ELSE NULL END
FROM yourtable

输入

1234
abcd
ab12
0000
9999

输出

xxx
(null)
(null)
(null)
xxx

SQL Fiddle: http://sqlfiddle.com/#!6/4b0e4/1/0

不需要AND/OR.

SELECT yourfield, 
CASE WHEN 0 = PATINDEX('%[^0-9]%', REPLACE(yourfield,'0000','aaaa'))
     THEN 'xxx'
     ELSE NULL 
END AS filtered
FROM yourtable

输出

yourfield filtered
1234      xxx
abcd      (null)
ab12      (null)
0000      (null)
9999      xxx

SQL Fiddle: http://sqlfiddle.com/#!6/4b0e4/45/0

这将为“0000”输出 NULL:

DECLARE @D VARCHAR(4) = '0000'

SELECT  (CASE WHEN @D NOT LIKE '%[^0-9]%'
             THEN CONVERT(INT, LEFT(NULLIF(@D, '0000'), 2))
             ELSE NULL
         END)

你根本不需要 LIKECASE:

DECLARE @D VARCHAR(4) = '0000';
SELECT LEFT(TRY_CAST(NULLIF(@D, '0000') AS INT),2)+0;

Rextester Demo


编辑:

SELECT s.d,LEFT(TRY_CAST(NULLIF(s.d, '0000') AS INT),2)+0
FROM (SELECT '0000' UNION SELECT '12ab' UNION SELECT '1234') s(d);

Rextester Demo2

输出:

0000    NULL
1234    12
12ab    NULL

有几点需要注意: 1. ELSE NULL在CASE语句中是多余的; NULL 是默认值 2. 如果只返回两个正数,则不需要 int; tinyint 就可以了。

还有其他几种方法:

技巧一

DECLARE @D VARCHAR(4) = '1x234'

SELECT
  CASE 
    WHEN PATINDEX('%[^0-9]%',@D)+CHARINDEX('0000',@D)=0 
        THEN CONVERT(tinyint, LEFT(@D, 2)) 
  END

技巧二

SELECT MAX(CONVERT(tinyint, LEFT(@D, 2)))
WHERE PATINDEX('%[^0-9]%',@D)+CHARINDEX('0000',@D) = 0