2

nvarchar(50)在 SQL Server 表中有列,数据如下:

123abc
234abc
456abc

我的查询:

select * 
from table 
where col like '%abc'

预期结果:应返回所有行实际结果:不返回任何行

如果列是,则工作正常,varchar但如果类型是,则不返回任何行nvarchar

有任何想法吗?

4

6 回答 6

9

您的数据末尾可能有空格。看看这个例子。

Declare @Temp Table(col nvarchar(50))

Insert Into @Temp(col) Values(N'123abc')
Insert Into @Temp(col) Values(N'456abc ')

Select * From @Temp Where Col Like '%abc'

当你运行上面的代码时,你只会得到 123 行,因为 456 行的末尾有一个空格。

当您运行如下所示的代码时,您将获得您期望的数据。

Declare @Temp Table(col nvarchar(50))

Insert Into @Temp(col) Values(N'123abc')
Insert Into @Temp(col) Values(N'456abc ')

Select * From @Temp Where rtrim(Col) Like '%abc'

根据在线书籍中有关 LIKE 的文档(重点是我的):http: //msdn.microsoft.com/en-us/library/ms179859.aspx

使用 LIKE 进行模式匹配

LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。当所有参数(match_expression、pattern 和 escape_character,如果存在)都是 ASCII 字符数据类型时,将执行 ASCII 模式匹配。如果任何一个参数是 Unicode 数据类型,则所有参数都将转换为 Unicode 并执行 Unicode 模式匹配。当您将 Unicode 数据(nchar 或 nvarchar 数据类型)与 LIKE 一起使用时,尾随空格很重要;但是,对于非 Unicode 数据,尾随空格并不重要。Unicode LIKE 与 ISO 标准兼容。ASCII LIKE 与早期版本的 SQL Server 兼容。

于 2012-04-17T22:31:58.677 回答
4

对于nvarchar类型,您可以像这样使用选择:-

select * from Table where ColumnName like N'%abc%'
于 2018-12-16T12:56:09.923 回答
1

您确定值的末尾没有空格吗?您可以这样做来删除空白:

select *
from yourTable
where rtrim(yourcolumn) like '%abc'

如果您不想一起使用RTRIMand ,LIKE您也可以使用:

Select * 
From yourTable 
Where charindex('abc', col) > 0

来自微软关于使用LIKE

SQL Server 遵循关于如何比较字符串和空格的 ANSI/ISO SQL-92 规范(第 8.2 节,一般规则 #3)。ANSI 标准要求对比较中使用的字符串进行填充,以便它们的长度在比较之前匹配。填充直接影响 WHERE 和 HAVING 子句谓词的语义以及其他 Transact-SQL 字符串比较。例如,Transact-SQL 认为字符串“abc”和“abc”对于大多数比较操作是等效的。

此规则的唯一例外是 LIKE 谓词。当 LIKE 谓词表达式的右侧具有一个带有尾随空格的值时,SQL Server 不会在比较发生之前将这两个值填充到相同的长度。因为根据定义,LIKE 谓词的目的是促进模式搜索而不是简单的字符串相等测试,所以这并不违反前面提到的 ANSI SQL-92 规范部分。

如果您知道“abc”字符串的起始位置,那么您可以使用SUBSTRING

Select *
From yourTable 
Where substring(Col, 4, 3) = 'abc'

但是你可以一起使用 charindex 和 substring 并且你不必担心空格:

select *
from yourTable
where substring(col, charindex('abc', col), 3) = 'abc'
于 2012-04-17T22:33:36.750 回答
1

您的查询应该可以正常工作,但您也可以尝试。

SELECT * FROM TABLE WHERE (COL LIKE '%abc%')

如果在“abc”部分之后看不到字符。

于 2012-04-17T22:42:07.283 回答
0

只是为了记录一些 ASCII 与 Unicode 的怪异之处:

-- ascii like
if 'Non rational ' like 'Non[ --]rational%'  print 'like' else  print 'not like'

-- unicode like
if N'Non rational ' like N'Non[ --]rational%' print 'like' else  print 'not like'

-- unicode like, trailing space removed
if N'Non rational' like N'Non[ --]rational%' print 'like' else  print 'not like'

-- unicode like, different wildcard
 if N'Non rational ' like N'Non_rational%' print 'like' else  print 'not like'

产生以下内容:

like
not like
not like
like
于 2019-01-18T23:37:03.897 回答
0

这将正常工作。你可以试试。

SELECT * 
FROM "table"
WHERE CAST("col" AS VARCHAR) LIKE '%abc'
于 2021-01-02T18:01:24.847 回答