如何比较字符串,使比较只有在每个字符串的大小写相等时才为真。例如:

Select * from a_table where attribute = 'k'

...将返回一个属性为'K'的行。我不想要这种行为。


当前回答

你也可以使用下面的语法将该属性转换为区分大小写:

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS

现在您的搜索将区分大小写。

如果您想再次使该列不区分大小写,则使用

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS

其他回答

就像你可以使用HASHBYTES的另一种选择一样,像这样:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')

你也可以使用下面的语法将该属性转换为区分大小写:

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS

现在您的搜索将区分大小写。

如果您想再次使该列不区分大小写,则使用

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS

您可以将属性定义为BINARY或使用INSTR或STRCMP执行搜索。

简化一般答案

SQL区分大小写字符串比较

下面的例子可能会有帮助:

Declare @S1 varchar(20) = 'SQL'
Declare @S2 varchar(20) = 'sql'

  
if @S1 = @S2 print 'equal!' else print 'NOT equal!' -- equal (default non-case sensitivity for SQL

if cast(@S1 as binary) = cast(Upper(@S2) as binary) print 'equal!' else print 'NOT equal!' -- equal

if cast(@S1 as binary) = cast(@S2 as binary) print 'equal!' else print 'NOT equal!' -- not equal

if  @S1 COLLATE Latin1_General_CS_AS  = Upper(@S2) COLLATE Latin1_General_CS_AS  print 'equal!' else print 'NOT equal!' -- equal

if  @S1 COLLATE Latin1_General_CS_AS  = @S2 COLLATE Latin1_General_CS_AS  print 'equal!' else print 'NOT equal!' -- not equal

 

转换可能比运行时计算哈希字节更有效,我预计排序可能更快。

Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 

成功了。