2015-10-19 260 views
1

这是我的场景。执行不区分大小写在区分大小写的SQL Server数据库中使用查询

SQL Server 2014标准版,我有一个数据库,其中的排序规则为SQL_Latin1_General_CP437_BIN2,区分大小写。

我想执行一个LIKE查询,它应该返回输出,而不管区分大小写。例如,如果我执行Like查询以获取userName'John'的记录,则它应该返回行,而不管区分大小写'JOHN','John','john','joHN'。

我试着用LcaseUcase,但我得到的错误

消息195,级别15,状态10,行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 

专家帮我出您宝贵的建议,我有点糊涂了使用基于整理DB的。

+3

SQL Server的功能ŧ将字符值更改为大写或小写,实际称为“上”和“下”。 ([字符串函数列表](https://msdn.microsoft.com/en-GB/library/ms181984.aspx)。)您可能正在查看错误的RDBMS的文档... –

+0

@Matt Gibson感谢指出我,我应该使用UPPER/LOWER。 – Rajakrishnan

回答

5

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

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

或者,你可以比较时手动指定归类:

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

感谢您宝贵的建议,它的工作.. – Rajakrishnan

+0

@AlexFritz您提出的编辑是不正确的,使用'COLLATE'不会导致表扫描。另外,你应该添加这样的文字作为评论,而不是编辑。 – DavidG

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,除非您有意招致删除重复的开销。

+0

感谢您的宝贵意见..上/下解决了我的问题... – Rajakrishnan

-2

使用代码下面

SELECT TOP 300 * FROM (SELECT userNo,用户名,地点,生日 FROM用户表 WHERE PERSONID = 2 AND(名称LIKE '%约翰%') UNION

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

ORDER BY userNo

+0

这将专门*不*工作。 – DavidG