如何比较字符串,使比较只有在每个字符串的大小写相等时才为真。例如:
Select * from a_table where attribute = 'k'
...将返回一个属性为'K'的行。我不想要这种行为。
如何比较字符串,使比较只有在每个字符串的大小写相等时才为真。例如:
Select * from a_table where attribute = 'k'
...将返回一个属性为'K'的行。我不想要这种行为。
当前回答
就像你可以使用HASHBYTES的另一种选择一样,像这样:
SELECT *
FROM a_table
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')
其他回答
您可以将属性定义为BINARY或使用INSTR或STRCMP执行搜索。
Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS
成功了。
简化一般答案
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
转换可能比运行时计算哈希字节更有效,我预计排序可能更快。
你可以很容易地将列转换为VARBINARY(最大长度),长度必须是你期望的最大长度,以避免有缺陷的比较,这就足够将长度设置为列的长度。修剪列帮助你比较真实的值,除了空间在你的表列中有意义和价值,这是一个简单的例子,正如你所看到的,我修剪列值,然后转换和比较:
CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))
希望这对你有所帮助。
就像你可以使用HASHBYTES的另一种选择一样,像这样:
SELECT *
FROM a_table
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')