sql >> データベース >  >> RDS >> PostgreSQL

タグの配列をplpgsql関数に渡し、WHERE条件で使用します

    あなたは実際には戻ってきたではありません 結果。 RETURN QUERY EXECUTEを使用します そのために。例:

    ただし、最初に動的SQLは必要ありません...

    CREATE OR REPLACE FUNCTION get_items_by_tag(VARIADIC tags text[])
      RETURNS TABLE (id int, title text, tag text[]) AS
    $func$
    BEGIN
       IF array_length(tags, 1) > 0 THEN
          -- NO need for EXECUTE
          RETURN QUERY
          SELECT d.id, d.title, array_agg(t.title)
          FROM   items d
          JOIN   item_tags dt ON dt.item_id = d.id
          JOIN   tags t       ON t.id = dt.tag_id
          AND    t.title = ANY ($1)     -- use ANY construct
          GROUP  BY d.id;               -- PK covers whole table
          -- array_to_string(tags, ',') -- no need to convert array with ANY
    -- ELSE ...
       END IF;
    END
    $func$  LANGUAGE plpgsql;
    

    実際の配列で呼び出す:

    SELECT * FROM get_items_by_tag(VARIADIC '{tag1,tag2}'::text[]);
    

    または、アイテムのリスト(「辞書」)を使用して呼び出します:

    SELECT * FROM get_items_by_tag('tag1', 'tag2');
    

    主なポイント

    IF array_length(tags, 1) > 0 THENがある理由がわかりません 、ただし、おそらくIF tags IS NOT NULL THENに置き換えることができます。 またはIFなし まったく、IF NOT FOUND THENでフォローアップします 。詳細:



    1. PostGIS、いくつかのポイントからポリゴンを作成することが可能です

    2. 順番に並んでいる行のみによるSQLグループ化

    3. MySQL:sql_modeを永続的に設定する

    4. OleDBデータプロバイダーが見つかりませんVBA/Excel