4

我想比较一个字符串以查看它是否包含子字符串,但是,当我使用一个变量时,当它应该为假时,它的计算结果为真。

知道为什么会发生这种情况以及如何解决这个问题吗?

DECLARE @Match VARCHAR
SET @Match = '%Matching%'

SELECT CASE WHEN 'Does This Match' LIKE @Match THEN 1 ELSE 0 END -- 1
SELECT CASE WHEN 'Does This Match' LIKE '%Matching%' THEN 1 ELSE 0 END -- 0
4

2 回答 2

5

这是一个愚蠢的问题。如果您VARCHAR在 a 中声明某些内容,CAST则它会自动调整 VARCHAR 的大小适当地VARCHAR(30). 但是,在这种情况下,您只有一个 VARCHAR 字符。因此,当您将其设置为%Matching%因为@Match只有一个字符长时,将被设置为与该短语(以及任何短语!)匹配@Match的通配符。%

DECLARE @Match VARCHAR(50)

这样做,然后工作。

完整示例:

DECLARE @BadMatch VARCHAR
SET @BadMatch = '%Matching%'


DECLARE @Match VARCHAR(20)
SET @Match = '%Matching%'

SELECT @BadMatch, @Match

SELECT CASE WHEN 'Does This Match' LIKE @Match THEN 1 ELSE 0 END -- 1
SELECT CASE WHEN 'Does This Match' LIKE '%Matching%' THEN 1 ELSE 0 END -- 0
于 2013-11-05T13:34:44.600 回答
1

varchar 将不起作用,因为这相当于 varchar(1) 一个字符宽。使用 varchar(SIZE)

于 2013-11-05T13:35:04.197 回答