我在SQL Server表中有nvarchar(50)列,数据如下:
123abc
234abc
456abc我的问题是:
select *
from table
where col like '%abc'预期结果:应返回所有行实际结果:未返回任何行
如果列为varchar,则工作正常,但如果类型为nvarchar,则不返回任何行。
有什么想法吗?
发布于 2012-04-18 06:31:59
您的数据末尾可能会有空格。看一下这个例子。
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的早期版本兼容。
发布于 2018-12-16 20:56:10
对于nvarchar类型,您可以像这样使用select:
select * from Table where ColumnName like N'%abc%'发布于 2012-04-18 06:33:37
您确定值的末尾没有空格吗?您可以这样做来删除空格:
select *
from yourTable
where rtrim(yourcolumn) like '%abc'如果您不想同时使用RTRIM和LIKE,也可以使用:
Select *
From yourTable
Where charindex('abc', col) > 0来自微软关于使用LIKE的信息
有关如何比较字符串和空格,
SQL Server遵循ANSI/ISO 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'https://stackoverflow.com/questions/10200125
复制相似问题