在区分大小写的SQL Server数据库中执行不区分大小写的Like查询

时间:2015-10-19 12:05:10

标签: sql-server collation sql-server-2014

这是我的情景。

SQL Server 2014标准版,我有一个数据库SQL_Latin1_General_CP437_BIN2,区分大小写。

我想执行一个LIKE查询,该查询应该返回输出而不管区分大小写。

例如:如果我执行Like查询以使用userName' John'来获取记录。它也应该返回行,而不管区分大小如何,约翰'约翰'约翰' john'

;

我尝试使用LcaseUcase,但我收到了错误

  

Msg 195,Level 15,State 10,Line 4
  ' LCASE'不是公认的内置函数名称。

这是我的示例查询

SELECT TOP 300 * 
FROM
    (SELECT 
         userNo, userName, Place, Birthdate
     FROM usertable 
     WHERE personid = 2 
       AND (Name LIKE LCASE('%john%')) 

     UNION 

     SELECT 
         userNo, userName, Place, Birthdate, 
     FROM usertable2 
     WHERE personid = 2 
       AND (Name LIKE LCASE( '%john%') OR Place LIKE LCASE('%NY%')) ) a 
ORDER BY 
    userNo

伙计们帮助我提出宝贵的建议,我对使用基于校对的数据库感到困惑。

4 个答案:

答案 0 :(得分:13)

您可以使用UPPERLOWER函数将值转换为相同的大小写。例如:

SELECT *
FROM YourTable
WHERE UPPER(YourColumn) = UPPER('VALUE')

或者,您可以在比较时手动指定排序规则:

SELECT *
FROM YourTable
WHERE YourColumn = 'VALUE' COLLATE SQL_Latin1_General_CP1_CI_AI

答案 1 :(得分:2)

除了使用lower()之外,您还需要将其应用于而非模式。模式已经是小写。

Select  top 300 a.*
from (SELECT userNo, userName, Place, Birthdate
      FROM usertable 
      where personid = 2 and lower(Name) LIKE '%john%'
      UNION 
      SELECT userNo, userName, Place, Birthdate
      FROM usertable2 
      where personid = 2 and
            (lower(Name) like '%john%' or lower(Place) like '%ny%')
     ) a
order by userNo;

请注意UNION ALL优于UNION,除非您故意要承担删除重复项的开销。

答案 2 :(得分:0)

不同数据库提供者的语法不同,例如:

<块引用> <块引用>

select * from TABLE1 where upper(COL) like 'SOMETHING',, 在 ODCB Provider for Microsoft 中给出语法错误...,正确的语法是: select * from TABLE1 where ucase(COL) like 'SOMETHING' ,即大写

所以你应该使用你的数据库提供者使用的正确语法

谢谢

答案 3 :(得分:-2)

使用下面的代码

选择TOP 300 * 从     (选择          userNo,userName,Place,Birthdate      来自usertable      人员= 2        AND(名字喜欢&#39;%约翰%&#39;)      UNION

 SELECT 
     userNo, userName, Place, Birthdate, 
 FROM usertable2 
 WHERE personid = 2 
   AND (Name LIKE '%john%' OR Place LIKE '%NY%') a 

ORDER BY     userNo