SQL Server 2016:数字通配符[^0-9]-筛选出0000

SQL Server 2016:数字通配符[^0-9]-筛选出0000,sql,sql-server,tsql,case,sql-server-2016,Sql,Sql Server,Tsql,Case,Sql Server 2016,我使用一个通配符作为一个4字符的字段来过滤掉非数字的值,这可以正常工作,但是我也想过滤掉“0000”值。是否可以不使用“和/或” 添加带有AND的额外参数 工作示例 SELECT CASE WHEN yourfield NOT LIKE '%[^0-9]%' AND yourfield != '0000' THEN 'xxx' ELSE NULL END FROM yourtable 输入 输出 xxx (null) (null) (null) xxx your

我使用一个通配符作为一个4字符的字段来过滤掉非数字的值,这可以正常工作,但是我也想过滤掉“0000”值。是否可以不使用“和/或”


添加带有AND的额外参数

工作示例

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

输出

xxx
(null)
(null)
(null)
xxx
yourfield filtered
1234      xxx
abcd      (null)
ab12      (null)
0000      (null)
9999      xxx
SQL Fiddle:

不需要和/或

输出

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

SQL FIDLE:

使用AND添加额外参数

工作示例

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

输出

xxx
(null)
(null)
(null)
xxx
yourfield filtered
1234      xxx
abcd      (null)
ab12      (null)
0000      (null)
9999      xxx
SQL Fiddle:

不需要和/或

输出

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

SQL FIDLE:

这将为“0000”输出空值:

DECLARE @D VARCHAR(4) = '0000'

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

这将为“0000”输出空值:

DECLARE @D VARCHAR(4) = '0000'

SELECT  (CASE WHEN @D NOT LIKE '%[^0-9]%'
             THEN CONVERT(INT, LEFT(NULLIF(@D, '0000'), 2))
             ELSE NULL
         END)
您根本不需要LIKE或CASE:

编辑:

输出:

0000    NULL
1234    12
12ab    NULL
您根本不需要LIKE或CASE:

编辑:

输出:

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

以下是其他几种方法:

技术1

技术2

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

以下是其他几种方法:

技术1

技术2


标记您正在使用的dbms。该代码是特定于产品的。标记您正在使用的dbms。该代码是特定于产品的。谢谢您的回答。我希望找到一个通配符/正则表达式解决方案,而不必使用和/OR@Tsar添加了不需要和/或的其他答案。有趣的是,执行计划是相同的,我应该选择哪一个?@Tsar数据集有多大?500K行,每行执行两次检查-选择LEFT@D, 2 & RIGHT@D,谢谢你的回答。我希望找到一个通配符/正则表达式解决方案,而不必使用和/OR@Tsar添加了不需要和/或的其他答案。有趣的是,执行计划是相同的,我应该选择哪一个?@Tsar数据集有多大?500K行,每行执行两次检查-选择LEFT@D, 2 & RIGHT@D2.