用于搜索小写字符串的SQL查询

时间:2014-02-26 16:36:18

标签: sql sql-server

我想要一个可以搜索某个单词的SQL查询,但只能是小写。

我正在尝试

select * from employees where name like LOWER('%smith%')但是,这并没有带来任何结果。

然而,当我这样做的时候 select * from employees where name like '%smith%'它返回名字为SMITH和smith的员工....在我的情况下,我只是希望它返回员工姓名较低的地方。

提前致谢!

3 个答案:

答案 0 :(得分:2)

您的默认排序规则可能设置为不区分大小写的选项。简单地说,这会导致所有字符比较都被执行,就好像比较的两边是相同的情况一样,无论这是否为真。

您可以在COLLATE子句中的列名后面使用WHERE语句:

select * from employees where name COLLATE Latin1_General_CS_AS like '%smith%'

但是,如果您非常需要进行区分大小写的比较,您可能希望更改数据库的默认排序规则,因为您可以看到显式标记排序规则非常详细。

答案 1 :(得分:1)

通常,为了以区分大小写的方式查询表,您可以使用区分大小写的排序规则来指定列(或整个数据库)。

出于性能原因,如果您将针对此列定期执行区分大小写的查询,那么这将是首选方法。

但是,在紧要关头,您可以动态指定查询排序规则。这是以更昂贵的查询计划为代价的,因此将其作为最后的手段。

例如:

SELECT * FROM Employees
WHERE EmployeeName COLLATE SQL_Latin1_General_CP1_CS_AS 
LIKE '%smith%'

有多种区分大小写的排序规则,因此您通常希望选择最接近您正在使用的标准不区分大小写排序规则的排序规则。

您可以通过运行这些语句来检查配置的排序规则:

--Server level
SELECT SERVERPROPERTY('COLLATION')

--Database level
SELECT DATABASEPROPERTYEX('DatabaseName', 'Collation')

--Column level
USE DatabaseName
GO
SELECT name, collation_name
FROM sys.columns
WHERE OBJECT_ID IN (SELECT OBJECT_ID
FROM sys.objects
WHERE type = 'U'
AND name = 'TableName')
AND name = 'ColumnName'

最有可能这些都将返回相同的值。例如,SQL_Latin1_General_CP1_CI_AS,在这种情况下,您将用于区分大小写的查询的排序规则将是SQL_Latin1_General_CP1_CS_AS。

根据您获得的结果,您需要选择相关的区分大小写的排序规则from this list

答案 2 :(得分:0)

使用collation COLLATE Latin1_General_CP1_CS_AS来明确区分大小写, 安装SQL Server时的默认排序规则为SQL_Latin1_General_CP1_CI_AS

select * from employees where name COLLATE Latin1_General_CS_AS like '%smith%'

其中

CS :区分大小写 AS :重音敏感