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

时间:2017-10-17 13:06:40

标签: sql sql-server tsql case sql-server-2016

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

DECLARE @D VARCHAR(4) = '0000'

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

4 个答案:

答案 0 :(得分:2)

使用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小提琴: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小提琴:http://sqlfiddle.com/#!6/4b0e4/45/0

答案 1 :(得分:2)

您根本不需要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

答案 2 :(得分:1)

这将为&#39; 0000&#39;输出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)

答案 3 :(得分:1)

有几点需要注意: 1. CASE语句中的ELSE NULL是多余的; NULL是默认值 如果你只返回两个正数,你就不需要int; tinyint没问题。

以下是其他几种方式:

技术1

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

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

技术2

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