为什么MS SQL Server会通过“ LIKE”查询返回结果,但使用'='

时间:2019-04-15 18:27:04

标签: sql sql-server

我正在使用MS SQL Server2017。在此示例中,我有一个带有实体full name (varchar(255)的表[myTable]。

在此表的内部,我导入了一条记录,其中包含以下参数

(FIELDTERMINATOR = '~',
 ROWTERMINATOR = '0x0A' )

以下查询返回单个记录:

SELECT [full name]
FROM myTable
WHERE [full name] LIKE '%LastName%'

但是,以下查询没有:

SELECT [full name]
FROM myTable
WHERE [full name] = 'Firstname Lastname'

我已验证记录是否存在,我已复制实体的值以确保数据没有有趣的事情在进行。它看起来很干净,我什至尝试过:

SELECT [full name]
FROM myTable
WHERE [full name] = 'Firstname Lastname ' 

确保列末尾没有随机空格。是什么会引起这样的问题?

4 个答案:

答案 0 :(得分:0)

=运算符仅在完全匹配时有效

但是{中使用LIKE运算符来搜索数据中的指定模式。

因此,在您的情况下,您的比较值不直接与列值匹配,这就是为什么它不返回任何行,而是在类似模式的情况下因此返回行的原因

答案 1 :(得分:0)

顾名思义,

LIKE主要用于比较某种形式的数据,这些形式主要是regular expressions

=仅找到完全匹配的内容,而不是它应该是某种形式,而是=左侧的数据应该是其右侧内容的清晰副本。

例如。

根据您上面的输入示例 ..where fullname LIKE %FirstName%。一般而言,这意味着选择其中有全名的数据

如果我替换此% ...where fullname LIKE FirstName 那么它将与 ...where fullname = FirstName因为这里想要的是完全匹配而不是某种形式的数据

答案 2 :(得分:0)

我有一个方便的脚本,用于识别不可见的字符;它会为您提供字符串中的每个字符,但每个字符单独排成一行。

DECLARE @nstring NVARCHAR(1000)

select top 1 @nstring = [full name]
FROM myTable
WHERE [full name] LIKE '%LastName%'

print @nstring

DECLARE @position INT
 SET @position = 1

DECLARE @CharList TABLE (
 Position INT,
 UnicodeChar NVARCHAR(1),
 UnicodeValue INT
 )

WHILE @position <= DATALENGTH(@nstring)
 BEGIN
 INSERT @CharList
 SELECT @position as Position
 ,CONVERT(nchar(1),SUBSTRING(@nstring, @position, 1)) as UnicodeChar
 ,UNICODE(SUBSTRING(@nstring, @position, 1)) as UnicodeValue
 SET @position = @position + 1
 END

SELECT * FROM @CharList

答案 3 :(得分:0)

mssqltips上有一条提示,提示您可以使用SSIS。本文还解释了ROWTERMINATOR出现的这个问题。话虽如此,我将创建一个SSIS项目,其中包含一个软件包,该软件包可以从数据源中插入批量数据。如果这是重复的过程,则可以在SSMS中安排或快速测试。

如果您是SSIS的新手或不熟悉SSIS,请在这里引用:SQL Server Integration Services