[英]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
或使用INSTR
或STRCMP
來執行搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.