【问题标题】:Condition WHERE string without/with space条件 WHERE 字符串不带/带空格
【发布时间】:2021-10-20 07:14:16
【问题描述】:

我有一些字符串的表。我想使用条件 string = eqauls 进行选择
我没有任何其他字符串....
当我拥有时,选择会返回更多行:
怎么了?

DECLARE @C VARCHAR(2) = 'A'+SPACE(1)
DECLARE @T TABLE (id INT NOT NULL, string VARCHAR(200) NOT NULL)
INSERT INTO @T
(
    id,
    string
)
VALUES
(   1,    'A'), (2,'A'+SPACE(1))


SELECT * FROM @T WHERE string = @C--With space only

返回:

id  string
1   A
2   A 

我知道选择 LIKE '%....' 很热门。
我想知道为什么 TSQL 会返回更多的行。

SQL 2019,MSSQL 版本 18.9.2

【问题讨论】:

标签: string tsql where-clause space


【解决方案1】:

在将字符串与= 进行比较时,SQL Server 遵循 ANSI 标准。在此处阅读更长的描述:https://dba.stackexchange.com/a/10511/7656

底线是,您不能使用= 检查尾随空格。使用LIKE 而不使用任何%

给定

CREATE TABLE T (id INT NOT NULL, string VARCHAR(200) NOT NULL)
INSERT INTO T VALUES (1, 'A')
INSERT INTO T VALUES (2, 'A ')

这个

SELECT id, len(string) len, datalength(string) datalength FROM T

结果

id len datalength
1 1 1
2 1 2

SELECT id FROM T WHERE string LIKE 'A '

会给你2。见http://sqlfiddle.com/#!18/2356c9/1

【讨论】:

    【解决方案2】:

    您可以使用以下解决方案之一

    -- Option 1: add to the filter the condition `DATALENGTH(@C) = DATALENGTH(string)` or 'DATALENGTH(@C) < DATALENGTH(string)'
    SELECT * FROM @T WHERE string = @C and DATALENGTH(@C) <= DATALENGTH(string)
    
    -- Option 2: Use `LIKE` and add the expresion '%'
    SELECT * FROM @T WHERE string like @C + '%'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      相关资源
      最近更新 更多