搜索任意数量的<space> sargable的最佳方法

时间:2018-04-24 09:20:21

标签: sql-server indexing sql-server-2012

我们希望改进一个SQL WHERE子句,它过滤NULL和只包含空格的值,但发现难以让解决方案使用该列上的索引,从而使sargable成为可能。

原件:

where isnull(ltrim(rtrim(ean_code)), N'') <> N''

建议:

where EAN_CODE is not null and EAN_CODE NOT IN ('', ' ', '  ', '   ', '    ', '     ')

有更好的解决方案吗?

2 个答案:

答案 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

输出

enter image description here

答案 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

You can see a live demo on rextester.