当在带有后缀空白SQL Server的VARCHAR中进行SELECT时的奇怪行为

问题描述 投票:0回答:2

我希望这对那里的SQL专家来说是一个有趣的难题。

当我运行以下查询时,我希望它不返回任何结果。

-- Create a table variable Note: This same behaviour occurs in standard tables.

DECLARE @TestResults TABLE (Id int IDENTITY(1,1) NOT NULL, Foo VARCHAR(100) NOT NULL, About VARCHAR(1000) NOT NULL)

-- Add some test data Note: Without space, space prefix and space suffix

INSERT INTO @TestResults(Foo, About) VALUES('Bar', 'No spaces')
INSERT INTO @TestResults(Foo, About) VALUES('Bar ', 'Space Suffix')
INSERT INTO @TestResults(Foo, About) VALUES(' Bar', 'Space prefix')

-- SELECT statement that is filtered by a value without a space and also a value with a space suffix

SELECT 
     t.Foo
     , t.About
FROM @TestResults t
WHERE t.Foo like 'Bar '
AND t.Foo like 'Bar'
AND t.Foo = 'Bar '
AND t.Foo = 'Bar'

结果返回单行:

[Foo]  [About]
Bar    Space Suffix

问题是人们正在从电子邮件等中复制和粘贴值,并且他们以某种方式进入表中。我正在将其作为一个单独的问题进行研究,因为我是LTRIM(RTRIM(Foo))作为INSERT和UPDATE触发器,但是有些正在以某种方式通过网络。

我需要详细了解这种行为以及如何解决该问题。

同样值得注意的是,LEN(Foo)也很奇怪,如下所示:

DECLARE @TestResults TABLE (Id int IDENTITY(1,1) NOT NULL, Foo VARCHAR(100) NOT NULL, About VARCHAR(1000) NOT NULL)
INSERT INTO @TestResults(Foo, About) VALUES('Bar', 'No spaces')
INSERT INTO @TestResults(Foo, About) VALUES('Bar ', 'Space Suffix')
INSERT INTO @TestResults(Foo, About) VALUES(' Bar', 'Space prefix')

SELECT 
     t.Foo
     , LEN(Foo) [Length]
     , t.About
FROM @TestResults t

给出以下结果:

[Foo]   [Length]  [About]
Bar     3         No spaces
Bar     3         Space Suffix
 Bar    4         Space prefix

没有任何横向思考,我需要将WHERE子句更改为什么才能按预期返回0个结果?

sql-server varchar trailing-whitespace
2个回答
0
投票

如果将查询更改为

SELECT 
     Foo
     , About
     , CASE WHEN Foo LIKE 'Bar ' THEN 'T' ELSE 'F' END As Like_Bar_Space
     , CASE WHEN Foo LIKE 'Bar'  THEN 'T' ELSE 'F' END As Like_Bar
     , CASE WHEN Foo =    'Bar ' THEN 'T' ELSE 'F' END As EQ_Bar_Space
     , CASE WHEN Foo =    'Bar'  THEN 'T' ELSE 'F' END As EQ_Bar
FROM @TestResults

它为您提供了更好的概览,因为您分别看到不同条件的结果:

Foo     About         Like_Bar_Space   Like_Bar   EQ_Bar_Space   EQ_Bar
------  ------------  ---------------  ---------  -------------  ------
Bar     No spaces      F                T          T              T
Bar     Space Suffix   T                T          T              T
 Bar    Space prefix   F                F          F              F

[似乎等于=会忽略搜索到的字符串和模式中的结尾空格。但是,LIKE不会忽略模式中的尾随空格,而是会忽略搜索到的字符串中的多余尾随空格。前导空格永远不会被忽略。

我不知道输入错误的地方,但是您可以通过以下方式解决它们:>

UPDATE @TestResults SET Foo = TRIM(Foo)

0
投票

正在运行以下查询...

© www.soinside.com 2019 - 2024. All rights reserved.