簡體   English   中英

SQL 區分大小寫的字符串比較

[英]SQL Case Sensitive String Compare

您如何比較字符串,以便僅當每個字符串的情況也相等時比較才為真。 例如:

Select * from a_table where attribute = 'k'

...將返回具有“K”屬性的行。 我不想要這種行為。

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

做到了。

您還可以使用以下語法將該屬性轉換為區分大小寫

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

您可以輕松地將列轉換為 VARBINARY(Max Length),長度必須是您期望的最大長度以避免有缺陷的比較,將長度設置為列長度就足夠了。 修剪列可幫助您比較實際值,除了空間在表列中具有含義和值外,這是一個簡單示例,正如您所看到的,我修剪列值,然后進行轉換和比較。:

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))

希望這有幫助。

作為另一種選擇,您可以使用 HASHBYTES,如下所示:

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

簡化一般答案

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

 

轉換可能比哈希字節的運行時計算更有效,我希望整理可能更快。

您可以將attribute定義為BINARY或使用INSTRSTRCMP來執行搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM