错误:运算符不存在:text[] ~~ text

Eva*_*oll 5 postgresql array operator like string-searching

我们有一个简单的语法,允许我们查看单个标量的数组,

SELECT 'foo' = ANY(ARRAY['foo', 'bar', 'baz']);
Run Code Online (Sandbox Code Playgroud)

我们可以用同样的方法来匹配 LIKE

SELECT 'foobar' LIKE ANY(ARRAY['foo%', 'bar%', 'baz%'];
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果你想做另一个。

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%';
Run Code Online (Sandbox Code Playgroud)

我知道语法不起作用,但我希望它起作用。

# 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.
Run Code Online (Sandbox Code Playgroud)

我想过滤一个数组以查看元素是否存在。这可能不使用unnest吗?

Jac*_*las 3

Postgres 手册表明您可能存在设计问题:

\n\n
\n

数组不是集合;搜索特定的数组元素可能是数据库设计错误的标志。考虑使用一个单独的表,其中每个项目都有一行,该项目将成为数组元素。这将更容易搜索,并且对于大量元素来说可能会更好地扩展。

\n
\n\n

你可以让你的操作符更高效 \xe2\x80\x94 如果它在第一次匹配后停止检查会更好:

\n\n\n\n
\n
CREATE OR REPLACE FUNCTION like_in_array( arr text[], pattern text )\nRETURNS bool AS $$\n  SELECT coalesce(( SELECT true\n                    FROM unnest(arr) AS u(n)\n                    WHERE n LIKE pattern \n                    LIMIT 1),false);\n$$ LANGUAGE sql\nIMMUTABLE;\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

dbfiddle在这里

\n

  • `LIMIT 1 .. COALESCE` 总结在 `EXISTS` 中。 (2认同)