如果列数据以numeric开头,则类似操作返回nvarchar列过滤器上没有行

时间:2012-04-17 22:27:27

标签: sql sql-server-2008

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

123abc
234abc
456abc

我的查询:

select * 
from table 
where col like '%abc'

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

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

有什么想法吗?

6 个答案:

答案 0 :(得分:8)

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

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模式匹配。 当您对LIKE使用Unicode数据(nchar或nvarchar数据类型)时,尾随空白是重要的;但是,对于非Unicode数据,尾随空白并不重要。 Unicode LIKE与ISO标准兼容。 ASCII LIKE与早期版本的SQL Server兼容。

答案 1 :(得分:1)

您确定该值末尾没有空格吗?您可以执行此操作以删除空格:

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

如果您不想同时使用RTRIMLIKE,也可以使用:

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

来自Microsoft,关于使用LIKE

  

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

     

此规则的唯一例外是LIKE谓词。当正确的时候   LIKE谓词表达式的一侧具有带尾随的值   空间,SQL Server不会将这两个值填充到相同的长度   在比较之前。因为喜欢的目的   根据定义,谓词是为了促进模式搜索   比简单的字符串相等测试,这不违反该部分   前面提到的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'

答案 2 :(得分:1)

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

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

如果在'abc'部分后面有字符,则无法看到。

答案 3 :(得分:0)

对于nvarchar类型,您可以使用如下选择:-

select * from Table where ColumnName like N'%abc%'

答案 4 :(得分:0)

只需记录一些ASCII vs 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

答案 5 :(得分:0)

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

Private Sub UserForm_Initialize()

With Me
  .StartUpPosition = 1
  .Top = 1
  .Left = 1
End With

With Me.ListBox1
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    'assign 2-dim array to .List property
    'to overcome default column count of 10 only!!
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    .Clear
    'needed to overcome default limit of 10 columns only!
    .List = Sheet1.[A1:M1].Value2          ' only column heads (i.e. 1 row) to start with
   '.RemoveItem 1                          ' (delete eventually if no head needed at all)
    .ColumnCount = 13
    .ColumnWidths = "30;50;100;60;30;110;110;90;50;40;50;80;60"
End With
  
End Sub