การค้นหาภายในอาร์เรย์
ตัวดำเนินการ ANY, contains และ overlap
การค้นหาภายในอาร์เรย์ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
อาร์เรย์เก็บค่าหลายค่า
ใน PostgreSQL คอลัมน์อาร์เรย์สามารถเก็บค่าหลายค่าไว้ในเซลล์เดียว ก่อนที่จะค้นหาภายในอาร์เรย์ การทำความเข้าใจก่อนว่าอาร์เรย์มีลักษณะอย่างไรจะช่วยได้
แบบสอบถามด้านล่างสร้างตารางที่แต่ละผลิตภัณฑ์อยู่ได้หลายหมวดหมู่ ซึ่งจัดเก็บเป็นอาร์เรย์ข้อความ
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
tags TEXT[]
);
INSERT INTO products (name, tags) VALUES
('Laptop', ARRAY['electronics', 'computers', 'sale']),
('T-Shirt', ARRAY['clothing', 'summer', 'sale']),
('Coffee Mug', ARRAY['kitchen', 'gifts']),
('Headphones', ARRAY['electronics', 'audio']),
('Notebook', ARRAY['stationery', 'office']);การตรวจสอบการเป็นสมาชิกด้วย ANY
ตัวดำเนินการ ANY ช่วยให้คุณตรวจสอบว่าค่าปรากฏอยู่ที่ใดก็ตามในอาร์เรย์หรือไม่ ไวยากรณ์คือ value = ANY(array_column)
แบบสอบถามนี้ค้นหาผลิตภัณฑ์ทั้งหมดที่มีแท็ก อุปกรณ์อิเล็กทรอนิกส์
SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);ANY ไม่ได้ใช้เฉพาะกับข้อความ
ANY ใช้ได้กับชนิดข้อมูลใด ๆ ที่รองรับการตรวจสอบความเท่ากัน ต่อไปนี้คือตารางคะแนนที่จัดเก็บเป็นอาร์เรย์จำนวนเต็ม แบบสอบถามจะดึงข้อมูลนักเรียนที่ได้คะแนนเต็ม 100 ในแบบทดสอบอย่างน้อยหนึ่งรายการ
CREATE TABLE students (
student TEXT,
scores INT[]
);
INSERT INTO students VALUES
('Alice', ARRAY[88, 95, 100]),
('Bob', ARRAY[70, 80, 90]),
('Carol', ARRAY[100, 100, 99]);
SELECT student, scores
FROM students
WHERE 100 = ANY(scores);การตัดแถวออกด้วย NOT + ANY
หากต้องการค้นหาแถวที่ค่า ไม่ ปรากฏอยู่ในอาร์เรย์ ให้ใช้ NOT ร่วมกับ ANY โปรดทราบว่า value <> ANY(arr) มีความหมายต่างกัน — นิพจน์นี้จะเป็นจริงหากมีองค์ประกอบใด ๆ แตกต่างกัน ซึ่งแทบจะเป็นจริงเสมอ
ใช้ NOT (value = ANY(arr)) เพื่อการตรวจสอบการตัดออกที่เชื่อถือได้
-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));ตัวดำเนินการบรรจุ @>
ตัวดำเนินการ @> ตรวจสอบว่าอาร์เรย์หนึ่ง บรรจุ องค์ประกอบทั้งหมดของอีกอาร์เรย์หนึ่งหรือไม่
ลองคิดว่าเป็นคำถามว่า อาร์เรย์ด้านซ้ายมีองค์ประกอบทุกตัวที่ระบุไว้ด้านขวาหรือไม่
แบบสอบถามนี้ค้นหาผลิตภัณฑ์ที่มีทั้งแท็ก อุปกรณ์อิเล็กทรอนิกส์ และแท็ก ลดราคา
SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];ตัวดำเนินการอยู่ภายใน <@
ตัวดำเนินการ <@ เป็นการกลับด้านของ @> โดยตรวจสอบว่าอาร์เรย์ด้านซ้ายอยู่ ภายใน อาร์เรย์ด้านขวาทั้งหมดหรือไม่
แบบสอบถามนี้ค้นหาผลิตภัณฑ์ที่รายการแท็กทั้งหมดเป็นสับเซตของชุด อุปกรณ์อิเล็กทรอนิกส์ คอมพิวเตอร์ ลดราคา
SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];ตัวดำเนินการซ้อนทับ &&
ตัวดำเนินการ && จะส่งคืนค่าเป็นจริงเมื่ออาร์เรย์สองชุดมีองค์ประกอบร่วมกัน อย่างน้อยหนึ่งรายการ ตัวดำเนินการนี้เทียบเท่ากับการถามว่า รายการสองรายการนี้มีอะไรที่เหมือนกันหรือไม่
แบบสอบถามด้านล่างค้นหาผลิตภัณฑ์ที่มีแท็กอย่างน้อยหนึ่งรายการร่วมกับรายการซื้อของที่กำหนด
SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];ความแตกต่างสำคัญระหว่างการซ้อนทับกับการบรรจุ
เป็นเรื่องง่ายที่จะสับสนระหว่าง @> กับ && ต่อไปนี้คือการเปรียบเทียบที่ชัดเจน:
tags @> ARRAY['a','b']— แถวต้องมีทั้ง สองรายการ คือ 'a' และ 'b'tags && ARRAY['a','b']— แถวต้องมี 'a' หรือ 'b' อย่างน้อยหนึ่งรายการ
-- Contains: must have BOTH 'electronics' AND 'sale'
SELECT name FROM products WHERE tags @> ARRAY['electronics', 'sale'];
-- Overlap: must have AT LEAST ONE of 'electronics' or 'sale'
SELECT name FROM products WHERE tags && ARRAY['electronics', 'sale'];การใช้ array_length เพื่อกรองตามขนาด
บางครั้งคุณอาจต้องการค้นหาแถวที่อาร์เรย์มีองค์ประกอบตามจำนวนที่กำหนด array_length(arr, 1) จะส่งคืนจำนวนองค์ประกอบในมิติแรก
แบบสอบถามนี้ค้นหาผลิตภัณฑ์ที่มีแท็กพอดีสามรายการ
SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;การรวมการค้นหาอาร์เรย์กับเงื่อนไขอื่น
ตัวดำเนินการอาร์เรย์ทำงานร่วมกับเงื่อนไขเอสคิวแอลทั่วไปได้ คุณสามารถใช้ร่วมกับ AND, OR และเงื่อนไขอื่น ๆ ในส่วนคำสั่ง WHERE เพื่อสร้างตัวกรองที่แม่นยำ
-- Products tagged 'sale' AND whose name starts with a letter before 'N'
SELECT name, tags
FROM products
WHERE 'sale' = ANY(tags)
AND name < 'N'
ORDER BY name;การทำดัชนีอาร์เรย์เพื่อเพิ่มความเร็ว
สำหรับตารางขนาดใหญ่ การค้นหาอาร์เรย์อาจช้าหากไม่มีดัชนี ดัชนี GIN (ดัชนีผกผันแบบทั่วไป) ของ PostgreSQL ได้รับการออกแบบมาสำหรับคอลัมน์อาร์เรย์ และรองรับตัวดำเนินการ @>, <@ และ && ได้อย่างมีประสิทธิภาพ
ANY ไม่ได้ใช้ดัชนี GIN โดยตรง แต่ตัวดำเนินการซ้อนทับและบรรจุใช้ดัชนีนี้ได้
-- Create a GIN index on the tags array column
CREATE INDEX idx_products_tags ON products USING GIN (tags);
-- This query can now use the index
SELECT name FROM products WHERE tags @> ARRAY['electronics'];ตรวจสอบความเข้าใจ: ตัวดำเนินการอาร์เรย์
ทดสอบความเข้าใจเกี่ยวกับตัวดำเนินการค้นหาอาร์เรย์ของ PostgreSQL
สรุปบทเรียน
ในบทนี้ คุณได้เรียนรู้วิธีหลักสามแบบในการค้นหาภายในอาร์เรย์ของ PostgreSQL:
- = ANY(arr) — ตรวจสอบว่าค่าเดียวมีอยู่ที่ใดก็ตามในอาร์เรย์หรือไม่
- @> (บรรจุ) — ตรวจสอบว่าอาร์เรย์มีองค์ประกอบที่ระบุไว้ ทั้งหมด
- && (ซ้อนทับ) — ตรวจสอบว่าอาร์เรย์มีองค์ประกอบร่วมกับอีกอาร์เรย์หนึ่ง อย่างน้อยหนึ่งรายการ
นอกจากนี้ คุณยังได้เห็น <@ สำหรับการตรวจสอบการอยู่ภายในแบบย้อนกลับ array_length สำหรับการกรองตามขนาด และ ดัชนี GIN เพื่อเร่งการค้นหาอาร์เรย์ในชุดข้อมูลขนาดใหญ่ การรวมตัวดำเนินการเหล่านี้เข้ากับเงื่อนไข WHERE มาตรฐานช่วยให้คุณควบคุมข้อมูลหลายค่าได้อย่างแม่นยำและยืดหยุ่น
เรียนรู้ SQL ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 46
- บทเรียน
- 183
คำถามที่พบบ่อย
บทเรียน “การค้นหาภายในอาร์เรย์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การค้นหาภายในอาร์เรย์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การค้นหาภายในอาร์เรย์”
ตัวดำเนินการ ANY, contains และ overlap คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การค้นหาภายในอาร์เรย์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานคอลัมน์อาร์เรย์
- การค้นหาภายในอาร์เรย์
- UNNEST และการรวมค่า
- อาร์เรย์เทียบกับตารางแบบทำให้เป็นมาตรฐาน