Postgresql

錯誤:運算符不存在:文本~~ 文字

  • January 3, 2018

我們有一個簡單的語法,可以讓我們查看單個標量的數組,

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在這裡

引用自:https://dba.stackexchange.com/questions/194451