แบบสอบถาม SQL โดยที่ฟิลด์ไม่มี $ x


133

ฉันต้องการค้นหาแบบสอบถาม SQL เพื่อค้นหาแถวที่ field1 ไม่มี $ x ฉันจะทำเช่นนี้ได้อย่างไร?


ฉันสามารถใช้ฟังก์ชัน CONTAINS () (sql) เพื่อทำการตรวจสอบเดียวกันได้หรือไม่
Kate

คำตอบ:


291

สนามนี้เป็นแบบไหน? ไม่สามารถใช้ตัวดำเนินการ IN กับเขตข้อมูลเดียว แต่หมายถึงการใช้ในการสืบค้นย่อยหรือกับรายการที่กำหนดไว้ล่วงหน้า:

-- subquery
SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y);
-- predefined list
SELECT a FROM x WHERE x.b NOT IN (1, 2, 3, 6);

หากคุณกำลังค้นหาสตริงให้ไปที่ตัวดำเนินการ LIKE (แต่จะช้า):

-- Finds all rows where a does not contain "text"
SELECT * FROM x WHERE x.a NOT LIKE '%text%';

หากคุณ จำกัด เพื่อให้สตริงที่คุณค้นหาต้องขึ้นต้นด้วยสตริงที่กำหนดก็สามารถใช้ดัชนี (หากมีดัชนีในฟิลด์นั้น) และเร็วพอสมควร:

-- Finds all rows where a does not start with "text"
SELECT * FROM x WHERE x.a NOT LIKE 'text%';

1
xb คืออะไร? จดหมายของคุณสับสนมาก ฉันแนะนำให้ใช้ตารางหรือฟิลด์
Whitecat

ตรวจสอบให้แน่ใจว่าหากคุณใช้แบบสอบถามย่อยสำหรับNOT INค่านั้นจะไม่มีค่าเป็น NULL เนื่องจากNOT IN และ NULL จะไม่รวมกันอย่างชัดเจนหากคุณไม่คุ้นเคยกับตรรกะสามค่า ที่นี่คุณจะใช้SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y WHERE b IS NOT NULL); ถ้าคุณต้องการยกเว้นค่า NULL ด้วยคุณจะต้องทำสิ่งนี้:SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y WHERE b IS NOT NULL) AND x.b IS NOT NULL;
Bacon Bits

17

SELECT * FROM table WHERE field1 NOT LIKE '%$x%'; (ตรวจสอบให้แน่ใจว่าคุณหลบหนี $ x อย่างถูกต้องก่อนเพื่อหลีกเลี่ยงการฉีด SQL)

แก้ไข: NOT INทำบางสิ่งที่แตกต่างออกไปเล็กน้อย - คำถามของคุณยังไม่ชัดเจนดังนั้นให้เลือกว่าจะใช้ข้อใด LIKE 'xxx%'สามารถใช้ดัชนี LIKE '%xxx'หรือLIKE '%xxx%'ทำไม่ได้


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