12

text[]タイプの列にユーザー入力に似た値が含まれる行を取得しようとしています。

これまでに考えて実行したことは、'ANY'and 'LIKE' 演算子を次のように使用することです。

select * from someTable where '%someInput%' LIKE ANY(someColum);

しかし、うまくいきません。このクエリは、次のクエリと同じ値を返します。

select * from someTable where 'someInput' = ANY(someColum);

unnest()サブクエリで関数を使用して良い結果を得ましたがWHERE、可能であれば in 句でこれをクエリする必要があります。

LIKEオペレーターがオペレーターと連携せず、ANYエラーが発生しないのはなぜですか? ANY演算子がクエリの右辺にあるのも一因かなと思ったのですが…

使用せずにこれに対する解決策はありますか?節unnest()で可能であれば?WHERE

4

4 に答える 4

8

私の質問は重複とマークされ、不注意な mod によってコンテキスト外の質問にリンクされました。この質問は私が尋ねたものに最も近いので、ここに回答を残します。(解決策になる人に役立つかもしれないと思いますunnest()

DISTINCT私の場合、との組み合わせがunnest()解決策でした:

SELECT DISTINCT ON (id_) *
FROM (
  SELECT unnest(tags) tag, *
  FROM someTable
  ) x
WHERE (tag like '%someInput%');

unnest(tags)DISTINCT ON (id_)一意の列に基づいて、テキスト配列を行のリストに展開し、展開の結果として生じる重複を削除しid_ます。

アップデート

DISTINCT内でこれを行う別の方法は次のとおりです。WHERE

SELECT *
FROM someTable 
WHERE (
  0 < (
    SELECT COUNT(*) 
    FROM unnest(tags) AS tag
    WHERE tag LIKE '%someInput%'
  )
);
于 2018-05-10T15:20:42.623 に答える
0

これをチェックしてください。

この答えはまさに私が探していたものでした。さらに柔軟性が必要な場合に備えて、いくつかの役立つヒント (および例) も提供します。

基本的にANY()@>&&演算子について説明します。

「複数の値を検索する場合は、@> 演算子を使用できます」

「@> は、その配列にすべての値が含まれていることを意味します。現在の配列に別の配列の値が含まれているかどうかを検索する場合は、&& を使用できます」

于 2020-05-14T19:31:34.663 に答える