我们希望改进一个SQL WHERE子句,它过滤NULL和只包含空格的值,但发现难以让解决方案使用该列上的索引,从而使sargable成为可能。
原件:
where isnull(ltrim(rtrim(ean_code)), N'') <> N''
建议:
where EAN_CODE is not null and EAN_CODE NOT IN ('', ' ', ' ', ' ', ' ', ' ')
有更好的解决方案吗?
答案 0 :(得分:0)
这应该足够了
declare @t table
(
Val VARCHAR(20)
)
INSERT INTO @t
VALUES(null),(''),(' '),(' '),('Sample'),(' Sample1'),('Sample2 '),(' Sample3 ')
select
*
from @t
WHERE LTRIM(RTRIM(ISNULL(Val,'')))<>''
或者你也可以试试这个
select
*
from @t
WHERE LEN(LTRIM(RTRIM(REPLACE(ISNULL(Val,''),' ',''))))<>0
输出
答案 1 :(得分:0)
正如Jeroen Mostert在评论中写道,您需要做的就是检查列是否不等于空字符串。
创建并填充样本表(请在将来的问题中保存此步骤)
DECLARE @T AS TABLE
(
Id int identity(1,1),
Col varchar(10)
)
INSERT INTO @T (Col) VALUES
(''),
(' '),
(' '),
(' '),
(' '),
('z'),
(NULL)
查询:
SELECT *
FROM @T
WHERE Col != ''
结果:
Id Col
6 z