Postgresql
錯誤:運算符不存在:文本~~ 文字
我們有一個簡單的語法,可以讓我們查看單個標量的數組,
SELECT 'foo' = ANY(ARRAY['foo', 'bar', 'baz']);
我們可以用同樣的方法來匹配
LIKE
SELECT 'foobar' LIKE ANY(ARRAY['foo%', 'bar%', 'baz%'];
我的問題是如果你想做另一個。
SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%' ERROR: syntax error at or near "ANY" LINE 1: SELECT ANY(ARRAY['foobar', 'barbar', 'bazbar']) LIKE 'foo%';
我知道語法不起作用,但我預計這會起作用。
# SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%'; ERROR: operator does not exist: text[] ~~ unknown LINE 1: SELECT ARRAY['foobar', 'barbar', 'bazbar'] LIKE 'foo%'; HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
我想過濾一個數組以查看一個元素是否存在。不使用這可能
unnest
嗎?
Postgres 手冊建議您可能遇到設計問題:
數組不是集合;搜尋特定的數組元素可能是數據庫設計錯誤的標誌。考慮使用一個單獨的表,其中每個項目將是一個數組元素。這將更容易搜尋,並且對於大量元素可能會更好地擴展。
您可以讓您的操作員更有效率——最好在第一次匹配後停止檢查:
CREATE OR REPLACE FUNCTION like_in_array( arr text[], pattern text ) RETURNS bool AS $$ SELECT coalesce(( SELECT true FROM unnest(arr) AS u(n) WHERE n LIKE pattern LIMIT 1),false); $$ LANGUAGE sql IMMUTABLE;
dbfiddle在這裡