我有一個字串foo,bar,我想要做的是形成一個匹配它們的查詢(它們之間可以有間隙)
例如,它應該與像這樣的條目匹配
aaa,bbbb,foo,zzz,bar
bar,ccc,ddddd,foo,iiiii
但不是
aaa,eeeee,foo,rrrrrr,hhhhhh
ooooo,ii,sssss,bar,xxxx
我試圖匹配的列是型別 text
我試著這樣做
select * from string_entries where str similar to '%(?=.*foo)(?=.*bar)%';
但我收到這個錯誤
ERROR: invalid regular expression: quantifier operand invalid
SQL state: 2201B
uj5u.com熱心網友回復:
假設這些值必須顯示為完整的逗號分隔條目,您可以使用
where str ~ '^(?=.*(?:,|^)foo(?:,|$))(?=.*(?:,|^)bar(?:,|$))'
在這里,它會匹配包含字串foo,并bar在使用任何順序~(正則運算式匹配)運算子。詳情:
^- 字串的開始(?=.*(?:,|^)foo(?:,|$))- 在右邊,應該有零個或多個字符,盡可能多,然后是一個foo字串(在字串的開頭或在逗號之后,后面跟一個逗號或字串的結尾位置)(?=.*(?:,|^)bar(?:,|$))- 在右邊,應該有零個或多個字符,盡可能多,然后是一個bar字串(在字串的開頭或在逗號之后,后面跟一個逗號或字串的結尾位置)
假設這些值必須顯示為整個單詞,您可以用\y單詞邊界替換非捕獲組并使用
where str ~ '^(?=.*\yfoo\y)(?=.*\ybar\y)'
請參閱
uj5u.com熱心網友回復:
我傾向于不使用正則運算式比較來執行此操作,而是將字串轉換為陣列:
select *
from string_entries
where string_to_array(str, ',') @> array['foo', 'bar']
這僅在您需要相等比較時才有效。如果您還想使用 egfoo%而不是匹配,foo那么這將起作用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/341559.html
標籤:sql 正则表达式 PostgreSQL
