SQL- ละเว้นเคสขณะค้นหาสตริง


131


ฉันมีข้อมูลต่อไปนี้ในตาราง
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

ใน SQL ฉันต้องเขียนแบบสอบถามที่ค้นหาสตริงในตาราง ในขณะที่ค้นหาสตริงควรละเว้นตัวพิมพ์ สำหรับแบบสอบถาม SQL ที่กล่าวถึงด้านล่าง

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

ให้ข้อมูลข้างต้นทั้งหมดในขณะที่

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

ไม่ให้

เช่น. เมื่อฉันค้นหา 'PriceOrder' หรือ 'priceOrder' มันใช้งานได้ แต่ 'priceorder' หรือ 'Priceorder' ไม่ทำงาน ฉันได้ลองใช้คำค้นหาด้านล่างโดยใช้ COLLATE แต่ไม่ได้ผล แจ้งให้ฉันทราบว่าฉันผิดพลาดตรงไหน

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'

คำตอบ:


235

ใช้อะไรแบบนี้ -

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')

หรือ

SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')

14
ฉันคิดว่าคุณควรเปรียบเทียบสตริงที่เป็นตัวพิมพ์ใหญ่ (UPPER) เป็นแนวทางปฏิบัติที่ดีที่สุด Google "turkish i"
Traubenfuchs

2
อยากทราบว่าคำตอบของคุณมีปัญหาด้านประสิทธิภาพหรือไม่โดยการแปลงค่าคอลัมน์เป็นUPPERหรือLOWERกรณีจากนั้นใช้LIKEเพื่อค้นหา
shaijut

จริงๆแล้วคุณจะต้องเปรียบเทียบตัวแปรทั้ง UPPER และ LOWER เนื่องจากอักขระบางตัวมีการแทนค่าต่างกันในตัวพิมพ์ใหญ่ แต่ใช้แทนตัวพิมพ์เล็กเหมือนกัน สำหรับตัวละครอื่นสิ่งที่ตรงกันข้ามอาจเป็นจริง Java กล่าวถึงอักษรจอร์เจียโดยเฉพาะเพื่อเป็นเหตุผลในการทำ toLowerCase () เพิ่มเติมในการเปรียบเทียบแบบไม่คำนึงถึงตัวพิมพ์
Crusha K. Rool

1
แต่น่าเสียดายที่วิธีการนี้จะทำให้ตารางการสแกนเต็มรูปแบบตามที่อธิบายไว้ในบทความนี้: alvinalexander.com/sql/... ไม่สามารถใช้การค้นหาดัชนีได้เนื่องจากคอลัมน์ที่กรองถูกแก้ไขโดยฟังก์ชัน UPPER / LOWER
Jeff S.

การตั้งค่าการเปรียบเทียบ (ก่อนสร้างดัชนี) ดูเหมือนจะเป็นแนวทางที่ดีกว่าหากประสิทธิภาพการสืบค้นที่มีบน / ล่างไม่เพียงพอ
Jeff S.

10

ดูคำถามและคำตอบที่คล้ายกันนี้สำหรับการค้นหาโดยไม่คำนึงถึงตัวพิมพ์ - เซิร์ฟเวอร์ SQL ละเว้นเคสในนิพจน์ where

ลองใช้สิ่งที่ชอบ:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'

ไม่ได้ผลฉันได้รับการสืบค้น SQL ไม่ได้สิ้นสุดลงอย่างถูกต้องก่อนที่จะเรียงต่อกัน
shockwave

@ Miguel-F .. มันใช้งานได้ดี แต่มันแตกต่างจาก SELECT DISTINCT COL_NAME จาก myTable WHERE COL_NAME LIKE '% priceorder%' อย่างไรเพราะมันก็ใช้ได้ดีเช่นกัน ..
Jishant

ฉันขอแนะนำให้ใช้ 'SQL_Latin1_General_Cp1_CI_AS_KI_WI' แทน ไม่ใช่กรณีที่น่าตื่นเต้นสำหรับการค้นหา
user8155123

10

แบบนี้.

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

ใน postgresql.


4
คำถามนี้ติดแท็กsql-serverดังนั้นคำตอบ postgres จึงไม่เกี่ยวข้อง
Liam

4

คุณควรใช้SQL_Latin1_General_Cp1_CI_AS_KI_WIเป็นการเปรียบเทียบ คำถามที่คุณระบุในคำถามของคุณมีความละเอียดอ่อนอย่างชัดเจน

คุณสามารถดูรายชื่อเรียงที่นี่

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