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)
你根本不需要 LIKE
或 CASE
:
DECLARE @D VARCHAR(4) = '0000';
SELECT LEFT(TRY_CAST(NULLIF(@D, '0000') AS INT),2)+0;
编辑:
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);
输出:
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
我在 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)
你根本不需要 LIKE
或 CASE
:
DECLARE @D VARCHAR(4) = '0000';
SELECT LEFT(TRY_CAST(NULLIF(@D, '0000') AS INT),2)+0;
编辑:
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);
输出:
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