เหตุใดการใช้อักขระขีดล่างในตัวกรอง LIKE จึงให้ผลลัพธ์ทั้งหมดแก่ฉัน


119

ฉันเขียนแบบสอบถาม SQL ด้านล่างโดยมีLIKEเงื่อนไข:

SELECT * FROM Manager
WHERE managerid LIKE '_%'
AND managername LIKE '%_%'

ในส่วนLIKEฉันต้องการค้นหาขีดล่าง%_%แต่ฉันรู้ว่าข้อมูลในคอลัมน์ของฉันไม่มีอักขระขีดล่าง

  • เหตุใดแบบสอบถามจึงให้บันทึกทั้งหมดจากตารางแก่ฉัน

ข้อมูลตัวอย่าง:

create table Manager(
    id int
    ,managerid varchar(3)
    ,managername varchar(50)
    );

insert into Manager(id,managerid,managername)values(1,'A1','Mangesh');
insert into Manager(id,managerid,managername)values(2,'A2','Sagar');
insert into Manager(id,managerid,managername)values(3,'C3','Ahmad');
insert into Manager(id,managerid,managername)values(4,'A4','Mango');
insert into Manager(id,managerid,managername)values(5,'B5','Sandesh');

Sql-Fiddle


1
เป็นการดีที่จะเพิ่มคิวรี sql-fiddle แต่คุณควรแสดงคิวรีใน SO เป็นข้อความธรรมดาเสมอ มิฉะนั้นคำถามนี้เป็นความเสี่ยงที่จะลิงก์เสีย
Tim Schmelter

_ :: แทนอักขระเดี่ยว
vhadalgi

คำตอบ:


195

ปรับเปลี่ยนWHEREเงื่อนไขของคุณดังนี้:

WHERE mycolumn LIKE '%\_%' ESCAPE '\'

นี่เป็นหนึ่งในวิธีที่ Oracle รองรับอักขระ Escape ที่นี่คุณกำหนดอักขระหลีกด้วยescapeคีย์เวิร์ด สำหรับรายละเอียดดูที่ลิงค์นี้ใน Oracle เอกสาร

'_'และ'%'เป็นสัญลักษณ์ในLIKEงบดำเนินการใน SQL

_ตัวละครลักษณะการปรากฏตัวของ (ใด ๆ ) ตัวละครตัวหนึ่งเดียว หากคุณค้นหาโดยcolumnName LIKE '_abc'มันจะทำให้คุณส่งผลกับแถวมี'aabc', 'xabc', '1abc', '#abc'แต่ไม่'abc', 'abcc', 'xabcd'และอื่น ๆ

'%'ตัวละครที่ถูกนำมาใช้สำหรับการจับคู่หรือ 0 จำนวนมากของตัวละคร ซึ่งหมายความว่าหากคุณค้นหาโดยcolumnName LIKE '%abc'มันจะทำให้คุณส่งผลกับการมี'abc', 'aabc', 'xyzabc'และอื่น ๆ แต่ไม่มี'xyzabcd', 'xabcdd'และสายอื่น ๆ ใด ๆ 'abc'ที่ไม่ได้จบด้วย

'%_%'ในกรณีของคุณที่คุณค้นหาโดย สิ่งนี้จะทำให้แถวทั้งหมดที่มีคอลัมน์นั้นมีอักขระอย่างน้อยหนึ่งตัวซึ่งหมายถึงอักขระใด ๆ เป็นค่าของมัน นี่คือสาเหตุที่คุณได้รับแถวทั้งหมดแม้ว่าจะไม่มี_ในค่าคอลัมน์ของคุณก็ตาม


ฉันประสบปัญหาเดียวกันในการเข้าถึงฐานข้อมูล ช่วยบอกฉันหน่อยได้ไหมว่าฉันจะแก้ปัญหานี้ได้อย่างไร

บางทีคุณสามารถ Google สำหรับ 'wildcards in access db' ฉันไม่เคยทำงานกับ Access ดังนั้นฉันจึงไม่สามารถช่วยคุณได้ ฉันยังสงสัยว่า Access รองรับlikeตัวดำเนินการหรือไม่ วิธีแก้ปัญหาของฉันจะใช้ได้กับฐานข้อมูลส่วนใหญ่ถ้าไม่ใช่ทั้งหมด
รัชชา

2
สิ่งที่ไม่ได้ระบุไว้ที่นี่คือสิ่งนี้ใช้ได้กับ SQL Server ด้วยซึ่งในตอนแรกทำให้ฉันรู้สึกแย่ว่าทำไม OP จึงยอมรับคำตอบสำหรับ Oracle SQL เมื่อพวกเขาติดแท็กคำถามสำหรับ SQL Server อย่างน้อยควรเขียนคำตอบเพื่อกำหนดเป้าหมาย DBMS ที่ติดแท็กไว้เป็นหลัก
underscore_d

87

ขีดล่างเป็นสัญลักษณ์แทนในการLIKEค้นหาสำหรับอักขระที่กำหนดเองหนึ่งตัว

ดังนั้นจึงLIKE %_%หมายความว่า "ให้บันทึกทั้งหมดที่มีอักขระตามอำเภอใจอย่างน้อยหนึ่งตัวในคอลัมน์นี้"

คุณต้องหลีกเลี่ยงอักขระตัวแทนใน sql-server ด้วย[]:

SELECT m.* 
FROM Manager m 
WHERE m.managerid    LIKE  '[_]%'
AND   m.managername  LIKE '%[_]%'

ดู: LIKE (Transact-SQL)

Demo


ขอขอบคุณที่ให้ลิงค์ MSDN ในคำตอบของคุณ ฉันมีปัญหาในการค้นหาข้อมูลเกี่ยวกับอักขระพิเศษขีดล่างจนกว่าฉันจะอ่านโพสต์ของคุณ
Chris Smith

5
นี่เป็นคำตอบที่ถูกต้องตามที่ผู้ใช้ระบุsql-serverแท็กในคำถามและ SQLFiddle ที่ให้มาก็ถูกกำหนดให้เป็น MS SQL Server 2008 ด้วย
Govind Rai

8

ตามที่คุณต้องการค้นหาอักขระตัวแทนโดยเฉพาะคุณต้องหลีกเลี่ยงสิ่งนั้น

ซึ่งทำได้โดยการเพิ่มESCAPEอนุประโยคในLIKEนิพจน์ของคุณ อักขระที่ระบุด้วยESCAPEประโยคจะ "ทำให้ไม่ถูกต้อง" อักขระตัวแทนต่อไปนี้

คุณสามารถใช้อักขระใดก็ได้ที่คุณต้องการ (ไม่ใช่อักขระตัวแทน) คนส่วนใหญ่ใช้ a \เพราะนั่นคือสิ่งที่ภาษาโปรแกรมต่างๆใช้เช่นกัน

ดังนั้นคำถามของคุณจะส่งผลให้:

select * 
from Manager
where managerid LIKE '\_%' escape '\'
and managername like '%\_%' escape '\';

แต่คุณสามารถใช้อักขระอื่น ๆ ได้เช่นกัน:

select * 
from Manager
where managerid LIKE '#_%' escape '#'
and managername like '%#_%' escape '#';

นี่คือตัวอย่าง SQLFiddle: http://sqlfiddle.com/#!6/63e88/4


5

ขีดล่างเป็นสัญลักษณ์แทนสำหรับบางสิ่ง ตัวอย่างเช่น 'A_%' จะค้นหาการจับคู่ทั้งหมดที่เริ่มต้นเล็กน้อย 'A' และมีอักขระพิเศษอย่างน้อย 1 ตัวหลังจากนั้น


0

คุณสามารถเขียนแบบสอบถามดังต่อไปนี้:

SELECT * FROM Manager
WHERE managerid LIKE '\_%' escape '\'
AND managername LIKE '%\_%' escape '\';

มันจะแก้ปัญหาของคุณ.


สิ่งนี้เพิ่มอะไรนอกเหนือจากคำตอบที่ยอมรับได้อย่างไร
Noah Broyles

0

ในกรณีที่ผู้ใช้กำลังค้นหาวิธีทำใน BigQuery:

  • ขีดล่าง "_" จะจับคู่อักขระเดี่ยวหรือไบต์

  • คุณสามารถหนี "\", "_" หรือ "%" ได้โดยใช้แบ็กสแลชสองตัว ตัวอย่างเช่น, "\%". หากคุณใช้สตริงดิบต้องใช้แบ็กสแลชเดียวเท่านั้น ตัวอย่างเช่น r "\%"

WHERE mycolumn LIKE '%\\_%'

ที่มา: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

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