การเปรียบเทียบสตริงที่มีความสำคัญของ Case SQL


234

คุณจะเปรียบเทียบสตริงได้อย่างไรเพื่อให้การเปรียบเทียบนั้นเป็นจริงเฉพาะถ้ากรณีของสตริงแต่ละรายการเท่ากัน ตัวอย่างเช่น:

Select * from a_table where attribute = 'k'

... จะส่งคืนแถวที่มีแอตทริบิวต์ 'K' ฉันไม่ต้องการพฤติกรรมนี้


อาจไม่ใช่สิ่งที่คุณต้องการ แต่คุณสามารถเปลี่ยน Collation หรือใช้ Collation เฉพาะในแบบสอบถามของคุณ
เทอรีเคน

7
ผลิตภัณฑ์ SQL ตัวใด
oneday เมื่อ

คำตอบ:


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

ทำเคล็ดลับ


4
ปกติฉันจะใช้ Latin1_General_Bin
gbn

3
ใช่วิธีการมาตรฐานคือการใช้การเปรียบเทียบแบบเรียงตามตัวพิมพ์เล็กและตัวพิมพ์ เป็นไวยากรณ์ SQL Server ของคุณหรือไม่
พุธที่

ในกรณีของฉันฉันมี 1 คอลัมน์ในฐานข้อมูลของฉันที่เป็นกรณี ๆ ไป ฉันต้องการเปรียบเทียบกับคอลัมน์มาตรฐาน (CI) ฉันใช้รูปแบบของ WHERE Foo.Bar นี้ = (Baz.Bar COLLATE Latin1_General_CS_AS)
Hypnovirus

2
ขอบคุณ แต่ Latin1_General_CS_AS คืออะไร? มันเป็นคำหลักพิเศษหรือไม่
Vijay Singh Rana

2
@VijaySinghRana Latin1_General_CS_ASเป็นข้อมูลจำเพาะของการเปรียบเทียบ การเรียงหน้าหมายถึงชุดของกฎที่กำหนดวิธีการเรียงลำดับและเปรียบเทียบข้อมูล ดูหน้านี้สำหรับข้อมูลเพิ่มเติม
amccormack

51

คุณยังสามารถแปลงแอททริบิวต์นั้นให้ตรงตามตัวพิมพ์เล็กและใหญ่โดยใช้ไวยากรณ์นี้:

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

29

คุณสามารถแปลงคอลัมน์เป็น VARBINARY ได้อย่างง่ายดาย (ความยาวสูงสุด) ความยาวจะต้องเป็นค่าสูงสุดที่คุณคาดหวังเพื่อหลีกเลี่ยงการเปรียบเทียบที่บกพร่องมันเพียงพอที่จะตั้งความยาวเป็นความยาวคอลัมน์ คอลัมน์ Trim ช่วยให้คุณเปรียบเทียบมูลค่าจริงยกเว้นช่องว่างมีความหมายและคุณค่าในคอลัมน์ตารางของคุณนี่เป็นตัวอย่างง่ายๆและอย่างที่คุณเห็น I Trim ค่าคอลัมน์แล้วแปลงและเปรียบเทียบ:

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

หวังว่าความช่วยเหลือนี้


2
สิ่งที่ฉันกำลังมองหา วิธีง่ายๆในการเปรียบเทียบแบบตัวเล็กและตัวเล็กเพื่อค้นหารายการที่มีอักขระตัวพิมพ์ใหญ่
Mike D.

20

เช่นเดียวกับทางเลือกอื่นที่คุณสามารถใช้ HASHBYTES ได้ดังนี้:

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

1
ชนกันอย่างไร มันจะหายาก แต่ฉันคิดว่าจะมีหลายสายที่แฮชกับค่าเดียวกัน
David Klempfner

ใช่เป็นไปได้ แต่หายากมากในตัวอย่างสตริงง่ายๆที่ฉันคิด
เดฟเซกซ์ตัน

@DavidKlempfner ทำไมไม่เปรียบเทียบก่อนและถ้าพวกเขาตรงกันแล้วยังตรวจสอบ hashbytes? เราสามารถทำให้ฟังก์ชันนี้และเรียกใช้เหมือน StringsAreCaseSensitiveEqual (a, b) => a = b AND HASHBYTES ('sha1', a) = HASHBYTES ('sha1', b)
Demetris Leptos

3

คุณสามารถกำหนดattributeเป็นBINARYหรือใช้INSTRหรือSTRCMPทำการค้นหาของคุณ


คำตอบนี้ดูเหมือนจะไม่เกี่ยวกับ SQL Server ต่อแท็กคำถาม DBMS นั้นขาดฟังก์ชั่นINSTRและSTRCMPฟังก์ชั่นเหล่านี้
โจนัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.