大小写敏感的字符串比较

6

我需要在存储过程中使用If-Else块比较两个字符串,例如:

If(@USERNAME='rajat')
begin
select * from table
end
else
begin
select * from table1
end

但以上方法的问题是'='比较不区分大小写。我需要一种比较方式,其中区分大小写。


可能是 SQL 大小写敏感字符串比较 的重复问题。 - NickyvV
可能是重复的问题。https://dev59.com/G3A75IYBdhLWcg3wRWyc?rq=1 - neildt
大小写敏感与等号无关。 大小写敏感是由数据库的排序规则决定的。 - vhadalgi
3个回答

11

SQL Server在服务器、数据库和列级别具有区分大小写的功能。这是排序规则属性的一部分。因此,在您的示例中,很可能已将其中一个或多个设置为不区分大小写。

-- Check server collation
SELECT SERVERPROPERTY('COLLATION')

-- Check database collation.
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

-- Check column collation
select table_name, column_name, collation_name
from information_schema.columns
where table_name = @table_name

以下这种SQL可能适用于您:

If (@USERNAME='rajat' COLLATE Latin1_General_CS_AS)
.....

+1 因为你在回答中提供了解释和其他相关信息,而不仅仅是发布工作代码而没有其他信息。这似乎是Stackoverflow上正在消失的一种艺术。 - GarethD
使用collate转换是否比使用upper()或lower()函数更有效?并且,根据使用的排序规则,collate可能会导致更改某些字符的问题。 - Mathese F
@MatheseF,upper/lower函数仅处理大小写敏感性。Collate还涉及排序规则和重音敏感性。我不知道哪个更高效。 - HTTP 410
@MatheseF,还可以查看这个SO问题的答案https://dev59.com/tFfUa4cB1Zd3GeqPJp-s。 - HTTP 410

4
另一种强制大小写敏感的方法是将两个参数都转换/转型为varbinary类型:-
declare @string1 as varchar(50) = 'abc'
declare @string2 as varchar(50) = 'ABC'

if @string1 = @string2
    print 'same'
else
    print 'different'

if convert(varbinary(50),@string1) = convert(varbinary(50),@string2)
    print 'same'
else
    print 'different'

产生:

same
different

3
If(@USERNAME='rajat' COLLATE Latin1_General_CS_AS )
begin
select * from table
end
else
begin
select * from table1
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接