ฉันจะหนีจากวงเล็บเหลี่ยมในส่วนคำสั่ง LIKE ได้อย่างไร


236

ฉันกำลังพยายามกรองรายการด้วยกระบวนงานที่เก็บไว้โดยใช้ Like คอลัมน์คือ varchar (15) รายการที่ฉันพยายามกรองมีชื่อวงเล็บในตาราง

ตัวอย่างเช่น WC[R]S123456.

ถ้าฉันทำLIKE 'WC[R]S123456'มันจะไม่ส่งคืนสิ่งใด

ฉันพบข้อมูลบางอย่างเกี่ยวกับการใช้ESCAPEคำหลักด้วยLIKEแต่ฉันไม่เข้าใจวิธีการใช้มันในการปฏิบัติต่อวงเล็บเหลี่ยมเป็นสตริงปกติ

คำตอบ:


328
LIKE 'WC[[]R]S123456' 

หรือ

LIKE 'WC\[R]S123456' ESCAPE '\'

ควรทำงาน.


10
จำเป็นต้องใช้คีย์เวิร์ด ESCAPE หากคุณต้องการใช้อักขระ escape แบบกำหนดเอง (แบ็กสแลชนั้นกำหนดเอง)
Ryan Kohn

2
ฉันแก้ไขส่วนอื่น ๆ ของคำตอบด้วย ซอ Fiddle ที่มีทั้งก่อนและหลังรุ่น
Martin Smith

10
หากใครไม่ชัดเจนว่าทำไมต้องใช้วงเล็บในการหลบหนีเอกสารสำหรับ LIKEจะระบุว่ามันถูกใช้เพื่อจับคู่อักขระเดี่ยวในช่วงหรือชุด ตัวอย่างเช่นการใช้LIKE '[fz]oo'จะจับคู่ทั้ง 'foo' และ 'zoo'
นักพัฒนาแบบองค์รวม

3
มันคงจะดีถ้ามีเหตุผลสำหรับคำตอบทั้งคู่ ไม่ชัดเจนในทันทีสำหรับฉันว่าทำไมตัวอย่างแรกจะใช้ได้จนกว่าฉันจะอ่านคำตอบจาก Amitesh ด้านล่าง
Don Jewett

1
ชอบLIKE 'WC\[R]S123456' ESCAPE '\'เนื่องจากสามารถอ่านได้มากกว่าสำหรับการบำรุงรักษา
Fire Druid

119

its[brac]etสมมติว่าคุณต้องการที่จะตรงกับอักษร

คุณไม่จำเป็นที่จะหลบหนีขณะที่มันมีความหมายพิเศษเฉพาะเมื่อมีการจับคู่กับ][

ดังนั้นการหลบหนี[พอเพียงเพื่อแก้ไขปัญหา คุณสามารถหลบหนีโดยการแทนที่มันด้วย[ [[]


7
นี่เป็นประโยชน์จริง ๆ และเป็นคำตอบที่ดีที่สุด
Jared Sol

1
[[]ดูแปลก ๆ แต่มันสมเหตุสมผลเมื่อคุณมองจากมุมมองของตัวแยกวิเคราะห์ parser มีกฎเฉพาะสำหรับวิธีจัดการกับอักขระ[ ]ต่างๆ ดังนั้นข้อความที่its[brac]etหมายถึง: "ค้นหาสตริงต่อเนื่องต่อไปนี้: its(ใช้กฎสำหรับวงเล็บ: brac)et " บนมืออื่น ๆ , its[[]brac]etวิธีการ: "ค้นหาสตริงต่อเนื่องต่อไปนี้: its(ใช้กฎสำหรับวงเล็บ: [)brac]et "
Brian

28

ฉันจำเป็นต้องยกเว้นชื่อที่เริ่มต้นด้วยการขีดเส้นใต้จากการสืบค้นดังนั้นฉันจึงลงเอยด้วย:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character

2
ฉันต้องใช้เวอร์ชันนี้ (ระบุอักขระ "escape" อย่างชัดเจน) - คำตอบอื่น ๆ ที่นี่ไม่ได้ให้ผลลัพธ์ที่ถูกต้องสำหรับฉัน
MarcE


15

คำหลัก ESCAPE จะใช้หากคุณต้องการค้นหาอักขระพิเศษเช่น% และ _ ซึ่งปกติแล้วจะเป็นการ์ด หากคุณระบุ ESCAPE SQL จะค้นหาอักขระ% และ _ อย่างแท้จริง

นี่เป็นบทความที่ดีที่มีตัวอย่างเพิ่มเติม

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'

6

หากคุณต้องการหลีกเลี่ยงอักขระพิเศษเช่น'_' (ขีดล่าง) เหมือนในกรณีของฉันและคุณไม่เต็มใจ / ไม่สามารถกำหนดคำสั่ง ESCAPE ได้คุณอาจต้องการใส่อักขระพิเศษด้วยวงเล็บเหลี่ยม'[ 'และ']'

สิ่งนี้จะอธิบายความหมายของสตริง "แปลก" '[[]' - มันเป็นเพียงการโอบกอดอักขระ'['ด้วยเครื่องหมายวงเล็บเหลี่ยมเพื่อหนีออกมาได้อย่างมีประสิทธิภาพ

กรณีการใช้งานของฉันคือการระบุชื่อของกระบวนงานที่เก็บไว้ด้วยขีดล่างเป็นเกณฑ์ตัวกรองสำหรับ Profiler ดังนั้นฉันจึงใส่สตริง'% name [_] ของ [_] a [_] ที่เก็บไว้ [_] ขั้นตอน%'ในฟิลด์ TextData LIKE และให้ผลลัพธ์การสืบค้นที่ฉันต้องการ

นี่คือตัวอย่างที่ดีจากเอกสาร: LIKE (Transact-SQL) - การใช้อักขระตัวแทนเป็นตัวอักษร


4

ตามเอกสาร :

คุณสามารถใช้อักขระการจับคู่รูปแบบสัญลักษณ์แทนเป็นตัวอักษร หากต้องการใช้อักขระไวด์การ์ดเป็นตัวอักษรให้ใส่อักขระไวด์การ์ดในวงเล็บ

คุณต้องหลบหนีสามตัวละครเหล่านี้%_[:

'5%'      LIKE '5[%]'      -- true
'5$'      LIKE '5[%]'      -- false
'foo_bar' LIKE 'foo[_]bar' -- true
'foo$bar' LIKE 'foo[_]bar' -- false
'foo[bar' LIKE 'foo[[]bar' -- true
'foo]bar' LIKE 'foo]bar'   -- true

1

แทนที่จะใช้ '\' หรืออักขระอื่นบนแป้นพิมพ์คุณสามารถใช้อักขระพิเศษที่ไม่ได้อยู่บนแป้นพิมพ์ได้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งานของคุณซึ่งอาจจำเป็นถ้าคุณไม่ต้องการให้ผู้ใช้ป้อนข้อมูลโดยไม่ตั้งใจจะถูกใช้เป็นอักขระเลี่ยง


2
ฉันมักจะใช้¬- มันยังคงเป็นตัวละครแป้นพิมพ์ในสหราชอาณาจักร แต่ไม่ค่อยได้ใช้อย่างรู้เท่าทัน :) (บนซ้ายระหว่างEscและTab)
Andi Mohr

ผู้ใช้ยังคงสามารถส่งข้อมูลที่มีตัวอักษรที่ไม่ได้อยู่บนคีย์บอร์ด คำตอบนี้ฟังดูน่าสงสัยว่าเป็นข้อเสนอแนะที่จะหลีกเลี่ยงการแก้ปัญหาจริง ๆ หรือไม่…
binki

0

ใช้การติดตาม

สำหรับการป้อนข้อมูลของผู้ใช้เพื่อค้นหาตามที่เป็นอยู่ให้ใช้ escape ซึ่งจะต้องมีการแทนที่อักขระพิเศษทั้งหมด (ด้านล่างครอบคลุม SQL Server ทั้งหมด)

ที่นี่การอ้างอิงเดี่ยว "" "ไม่ได้รับเนื่องจากไม่มีผลเหมือนกับประโยคเนื่องจากเป็นเรื่องของการต่อสตริง

ไม่จำเป็นต้องแทนที่ "-" & "^" & "]" เนื่องจากเรากำลังหลบหนี "["

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

จากนั้นใน SQL Query ควรมีดังต่อไปนี้ (ในแบบสอบถามแบบใช้พารามิเตอร์สามารถเพิ่มสตริงด้วยรูปแบบหลังจากการแทนที่ด้านบน)

เพื่อค้นหาสตริงที่แน่นอน

like 'FormattedString' ESCAPE 'ð'

เพื่อค้นหาเริ่มต้นด้วยสตริง

like '%FormattedString' ESCAPE 'ð'

เพื่อค้นหาจุดสิ้นสุดด้วยสตริง

like 'FormattedString%' ESCAPE 'ð'

เพื่อค้นหาด้วยสตริง

like '%FormattedString%' ESCAPE 'ð'

และอื่น ๆ สำหรับการจับคู่รูปแบบอื่น ๆ แต่การป้อนข้อมูลของผู้ใช้โดยตรงจำเป็นต้องจัดรูปแบบตามที่กล่าวไว้ข้างต้น


0

มีปัญหาในขณะที่:

LIKE 'WC[[]R]S123456' 

และ:

LIKE 'WC\[R]S123456' ESCAPE '\'

ทั้งทำงานกับ SQL Server แต่ไม่ทำงานสำหรับ Oracle

ดูเหมือนว่าไม่มีวิธี ISO / IEC 9075 ที่จะรับรู้รูปแบบที่เกี่ยวข้องกับรั้งซ้าย

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