SQL 服务器不区分大小写的查询
SQL Server case insensitive queries
我想在使用 SQL 服务器比较查询中的字符串时忽略大小写。到目前为止,我可以使用这样的方法来做到这一点:
SELECT *
FROM Venue
WHERE
Name COLLATE Latin1_general_CI_AI Like '%cafe%' COLLATE Latin1_general_CI_AI
有没有办法设置全局指令,以便它会影响每个查询?
像这样:
SET COLLATE Latin1_general_CI_AI;
SELECT *
FROM Venue
WHERE
Name Like '%this%';
SELECT *
FROM Venue
WHERE
Name Like '%that%';
...
谢谢!
Is there a way to set a global directive so that it would effect every query?
没有
排序规则不是应用于查询的会话属性,不能动态更改。
此请求的另一个问题是区分大小写不是一个可以自行启用或禁用的选项:它是排序规则的 属性,就像区分重音、区分宽度一样,特定字母表的排列顺序等。查询可以比较多个字段,每个字段具有不同的排序规则。因此,即使您可以设置一个对会话有效的排序规则,这也可能会强制其他排序规则的列在甚至没有被要求不区分大小写的情况下即时转换排序规则。全局会话设置也会影响排序(即 TOP(n)、ORDER BY 等),而不仅仅是比较。
由于问题是用户希望在每次执行时确定是否忽略部分排序规则,因此有几个选项,但都会导致一些性能损失:
在动态中构造查询(或多个查询)SQL:
DECLARE @SQL NVARCHAR(MAX),
@Collation NVARCHAR(50);
SET @Collation = '';
IF (@CaseInsensitive = 1)
BEGIN
SET @Collation = N'COLLATE Latin1_general_CI_AI';
END;
SET @SQL = N'SELECT *
FROM Venue
WHERE Name ' + @Collation + N' LIKE ''%' + @SearchParam
+ N'%'' ' + @Collation;
EXEC(@SQL);
将每个字符翻译成单个字符范围内的大小写对。这可以在应用程序层中针对正在搜索的参数值完成:
- 默认区分大小写(什么都不做):
@SearchParam = 'This'
- 不区分大小写:
@SearchParam = '[tT][hH][iI][sS]'
将所有内容强制设置为相同的大小写。假设做不区分大小写的选项是额外传入的参数:
SELECT *
FROM Venue
WHERE CASE @CaseInsensitive
WHEN 1 THEN LOWER(Name)
ELSE Name
END
LIKE
CASE @CaseInsensitive
WHEN 1 THEN '%' + LOWER(@SearchParam) + '%'
ELSE '%' + @SearchParam + '%'
END;
或者,在查询之前执行 LOWER()
:
IF (@CaseInsensitive = 1)
BEGIN
SET @SearchParam = LOWER(@SearchParam);
END;
SELECT *
FROM Venue
WHERE CASE @CaseInsensitive
WHEN 1 THEN LOWER(Name)
ELSE Name
END
LIKE '%' + @SearchParam + '%';
我想在使用 SQL 服务器比较查询中的字符串时忽略大小写。到目前为止,我可以使用这样的方法来做到这一点:
SELECT *
FROM Venue
WHERE
Name COLLATE Latin1_general_CI_AI Like '%cafe%' COLLATE Latin1_general_CI_AI
有没有办法设置全局指令,以便它会影响每个查询? 像这样:
SET COLLATE Latin1_general_CI_AI;
SELECT *
FROM Venue
WHERE
Name Like '%this%';
SELECT *
FROM Venue
WHERE
Name Like '%that%';
...
谢谢!
Is there a way to set a global directive so that it would effect every query?
没有
排序规则不是应用于查询的会话属性,不能动态更改。
此请求的另一个问题是区分大小写不是一个可以自行启用或禁用的选项:它是排序规则的 属性,就像区分重音、区分宽度一样,特定字母表的排列顺序等。查询可以比较多个字段,每个字段具有不同的排序规则。因此,即使您可以设置一个对会话有效的排序规则,这也可能会强制其他排序规则的列在甚至没有被要求不区分大小写的情况下即时转换排序规则。全局会话设置也会影响排序(即 TOP(n)、ORDER BY 等),而不仅仅是比较。
由于问题是用户希望在每次执行时确定是否忽略部分排序规则,因此有几个选项,但都会导致一些性能损失:
在动态中构造查询(或多个查询)SQL:
DECLARE @SQL NVARCHAR(MAX), @Collation NVARCHAR(50); SET @Collation = ''; IF (@CaseInsensitive = 1) BEGIN SET @Collation = N'COLLATE Latin1_general_CI_AI'; END; SET @SQL = N'SELECT * FROM Venue WHERE Name ' + @Collation + N' LIKE ''%' + @SearchParam + N'%'' ' + @Collation; EXEC(@SQL);
将每个字符翻译成单个字符范围内的大小写对。这可以在应用程序层中针对正在搜索的参数值完成:
- 默认区分大小写(什么都不做):
@SearchParam = 'This' - 不区分大小写:
@SearchParam = '[tT][hH][iI][sS]'
- 默认区分大小写(什么都不做):
将所有内容强制设置为相同的大小写。假设做不区分大小写的选项是额外传入的参数:
SELECT * FROM Venue WHERE CASE @CaseInsensitive WHEN 1 THEN LOWER(Name) ELSE Name END LIKE CASE @CaseInsensitive WHEN 1 THEN '%' + LOWER(@SearchParam) + '%' ELSE '%' + @SearchParam + '%' END;
或者,在查询之前执行
LOWER()
:IF (@CaseInsensitive = 1) BEGIN SET @SearchParam = LOWER(@SearchParam); END; SELECT * FROM Venue WHERE CASE @CaseInsensitive WHEN 1 THEN LOWER(Name) ELSE Name END LIKE '%' + @SearchParam + '%';