มีโครงสร้างใน SQL ที่จะอนุญาตให้ฉันทำสิ่งต่อไปนี้หรือไม่:
ใช่มีเกือบตรงตามที่คุณเขียนมัน เพียงใส่col1, col2
ในวงเล็บ:
-- works in PostgreSQL, Oracle, MySQL, DB2, HSQLDB
SELECT whatever
FROM t --- you missed the FROM
WHERE (col1, col2) --- parentheses here
IN ((val1a, val2a), (val1b, val2b), ...) ;
หากคุณลองใช้อย่างไรก็ตามใน DBMS คุณอาจพบว่ามันใช้งานไม่ได้ เพราะไม่ใช่ DBMS ทั้งหมดที่ใช้คุณสมบัติทั้งหมดของมาตรฐาน SQL (วิวัฒนาการ) ใช้งานได้กับ Oracle, MySQL, Postgres, DB2 และ HSQLDB เวอร์ชั่นล่าสุด (มันไม่ได้รับการปรับให้เหมาะสมใน MySQL และไม่ใช้ดัชนีดังนั้นควรหลีกเลี่ยงที่นั่นจนกว่าพวกเขาจะแก้ไขใน 5.7)
ดูเอกสาร MySQL เกี่ยวกับIN
ผู้ประกอบการและเอกสารเกี่ยวกับ Postgres ก่อสร้างแถว ทั้งสอง * (หรือมากกว่า) ค่าในวงเล็บจะเรียกว่าเป็นแถวคอนสตรัค
วิธีอื่น ๆ ที่แสดงความคิดเดียวกัน:
-- works in PostgreSQL, DB2
SELECT whatever
FROM t
WHERE (col1, col2)
IN ( VALUES (val1a, val2a), (val1b, val2b), ...) ;
SELECT t.whatever
FROM t
JOIN
( VALUES (val1a, val2a), (val1b, val2b), ...) AS x (col1, col2)
ON (x.col1, x.col2) = (t.col1, t.col2) ;
ทั้งทำงานใน Postgres และ DB2 (afaik) อันสุดท้ายสามารถปรับเปลี่ยนให้ทำงานใน SQL Server ได้เช่นกัน:
-- works in PostgreSQL, DB2, SQL Server
SELECT t.whatever
FROM t
JOIN
( VALUES (val1a, val2a), (val1b, val2b), ...) AS x (col1, col2)
ON x.col1 = t.col1
AND x.col2 = t.col2 ;
นอกจากนี้ยังสามารถปรับเปลี่ยนให้ทำงานได้ทุกที่โดยวางค่าลงในตาราง (ชั่วคราวหรือถาวร) ก่อน:
-- works everywhere
CREATE TABLE values_x
( col1 ...,
col2 ...) ;
-- use appropriate for the DBMS syntax here
INSERT INTO values_x (col1, col2)
VALUES (val1a, val2a), (val1b, val2b), ... ;
SELECT t.whatever
FROM t
JOIN values_x x
ON x.col1 = t.col1
AND x.col2 = t.col2 ;
DROP TABLE values_x ;
และยังมีทางยาวหรือแปลงIN
เป็นนิพจน์แบบยาวOR
ที่ควรทำงานได้ทุกที่:
-- works in all SQL DBMS
SELECT whatever
FROM t
WHERE col1 = val1a AND col2 = val2a
OR col1 = val1b AND col2 = val2b
---
;
*: จริง ๆ แล้วมันอาจเป็นเพียงค่าเดียวกับROW(v)
ดู Postgres เอกสาร
WHERE (x, y) IN (a,b)
ที่ไหน ฉันใช้ MySql บางทีฉันไม่รู้ว่าโครงสร้างนี้เรียกว่าอะไร