我在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)
答案 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
答案 1 :(得分:2)
您根本不需要LIKE
或CASE
:
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