สัญลักษณ์แทน PostgreSQL เช่นเดียวกับรายการคำใด ๆ


156

ฉันมีรายการคำศัพท์ประมาณ 25 คำ ฉันมีฟิลด์ varchar ใน PostgreSQL ['foo', 'bar', 'baz']สมมติว่ารายการที่เป็น ฉันต้องการค้นหาแถวในตารางของฉันที่มีคำใดคำหนึ่งเหล่านั้น สิ่งนี้จะได้ผล แต่ฉันต้องการบางสิ่งที่หรูหรากว่า

select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')

คำตอบ:


166

คุณสามารถใช้SIMILAR TOโอเปอเรเตอร์ของ Postgres ซึ่งรองรับการสับเปลี่ยนเช่น

select * from table where lower(value) similar to '%(foo|bar|baz)%';

1
Regex อาจเพิ่มความเร็วขึ้นเล็กน้อย: dba.stackexchange.com/questions/10694/…
ประมาณ

คุณรู้ได้อย่างไร ? เอกสารส่วนใหญ่ที่ฉันได้อ่านบอกว่า regex ช้าลงและ LIKE% ...
DestyNova

5
ตามที่dba.stackexchange.com/a/10696/27757 ได้ SIMILAR TOรับการแปลภายในเพื่อค้นหา regex
Mark K Cowan

ฉันคิดว่าการใช้lower()ไม่ได้ผลเพราะจะแปลงแต่ละสตริงเป็นตัวพิมพ์เล็กซึ่งมีราคาแพงกว่าการจับคู่แบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
gilad mayani

229

PostgreSQL ยังรองรับนิพจน์ปกติ POSIXแบบเต็ม:

select * from table where value ~* 'foo|bar|baz';

~*สำหรับกรณีการแข่งขันตาย~เป็นกรณีที่สำคัญ

ตัวเลือกอื่นคือการใช้งานใด ๆ :

select * from table where value  like any (array['%foo%', '%bar%', '%baz%']);
select * from table where value ilike any (array['%foo%', '%bar%', '%baz%']);

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


ที่น่าสนใจในขณะที่วิธีการทั้งสองนี้ดูดีกว่าโซลูชันของ @chmullig (ดังนั้น +1) เมื่อตรวจสอบ 3 ตัวเลือกอย่างน้อยพวกเขาก็ทำงานช้าลงอย่างมากในตารางขนาดใหญ่ (91.5 ล้านบันทึกในกรณีของฉัน) ฉันเห็นการเพิ่มเวลาประมาณ 2 เท่าเมื่อใช้อย่างใดอย่างหนึ่ง ความคิดใด ๆ ที่อาจเป็นเพราะอะไร
sage88

@ sage88 ฉันไม่รู้หัวของฉัน แต่ Erwin Brandstetter อาจและการเพิ่มดัชนี trigramอาจช่วยได้
mu สั้นเกินไป

13

จริงๆแล้วมีตัวดำเนินการสำหรับสิ่งนั้นใน PostgreSQL:

SELECT *
FROM table
WHERE lower(value) ~~ ANY('{%foo%,%bar%,%baz%}');


ดังนั้นสามารถiLikeจะใช้กับใด ๆและอาร์เรย์ในทางเดียวกันได้หรือไม่ สิ่งนี้ดูสะอาดหากไม่ต้องการ regex แฟนซี หรือมันจะถูกแปลเป็น regex ภายในหรือไม่
mlt

@mlt นั่นเป็นคำถามที่ดีการอ่านเอกสารไม่ได้ให้คำตอบที่ชัดเจน SIMILAR TOไม่แปลงเป็นนิพจน์ปกติ, ~ผู้ประกอบการย่อมาจาก POSIX นิพจน์ปกติ LIKEแต่ตอนนี้ยังไม่ชัดเจนสำหรับ
jlandercy

0

ทางออกหนึ่ง 'สง่างาม' จะใช้ค้นหาข้อความเต็ม: http://www.postgresql.org/docs/9.0/interactive/textsearch.html จากนั้นคุณจะใช้ข้อความค้นหาแบบเต็ม


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