2016-08-18 16 views
0

Arrayカラムの値のリストを探すクエリがある場合、結果テーブルの計算カラムとしてmatchedの値を取得する方法はありますか?PostgreSQL - 結果の配列フィールドの値が一致する

| name | tags    | query | <- I WANT query COLUMN 
|---------|-------------------|----------| 
| Cooking | {APPLE, EGGPLANT} | "APPLE" | 
| Frying | {TOMATO, ORANGE} | "ORANGE" | 
| Boiling | {APPLE}   | "APPLE" | 
+1

あなたはPLSQLか、単に標準のSQLを使用することはできますか? –

+0

@VladCălinBuzea、そうです。 – norbertpy

答えて

3
select name, b.tags, (
    select string_agg(t,',') 
    from 
     unnest(b.tags) t(t) 
     inner join 
     unnest(v.tags) s(t) using (t) 
    ) as query 
from 
    books b 
    inner join 
    (values (array['APPLE', 'ORANGE']::varchar[])) v(tags) on b.tags && v.tags 
; 
    name |  tags  | query 
---------+------------------+-------- 
Cooking | {APPLE,EGGPLANT} | APPLE 
Frying | {TOMATO,ORANGE} | ORANGE 
Boiling | {APPLE}   | APPLE 

データ:

create table books (name text, tags varchar[]); 
insert into books (name, tags) values 
('Cooking','{APPLE, EGGPLANT}'), 
('Frying','{TOMATO, ORANGE}'), 
('Boiling','{APPLE}'); 
3

CREATE OR REPLACE FUNCTION array_intersect (array1 varchar[], array2 varchar[]) RETURNS varchar[] 
    AS $$ 
    DECLARE 
     out VARCHAR[]; 
     i varchar; 
    BEGIN 
     IF array1 IS NULL OR array2 IS NULL THEN 
      RETURN NULL; 
     END IF; 
     FOR i IN array1 LOOP 
      IF (i = ANY (array2)) THEN 
       out := array_append(out,i); 
      END IF; 
     END LOOP; 
     RETURN out; 
    END; 
$$ LANGUAGE PLPGSQL; 

そして

SELECT name, tags, array_intersect(tags, ARRAY['APLLE', 'ORANGE']::varchar[]) 
FROM Books 
をお試しください:これは私が結果として持っているつもり何です

SELECT name, tags 
FROM Books 
WHERE Books.tags && ARRAY['APLLE', 'ORANGE']::varchar[] 

は、次のクエリを想像してみて

+0

ドキュメントをポイントできますか?私は 'array_intersect'を見つけられないようです。 – norbertpy

+1

私は自分の答えを更新しました。 array_intersectは標準関数ではないようです –

+0

'関数の作成または置換array_intersect(anyarray、anyarray)はanyarray immutable language sqlを$$として返します array_agg(t1.v)from unnest($ 1)from t1(v)join unnest( $ 2;) $$; ' – Abelisto

3
SELECT name, tags, fruit AS query 
FROM Books 
JOIN (VALUES ('APPLE', 'ORANGE')) f(fruit) ON true 
-- or JOIN unnest(ARRAY['APPLE', 'ORANGE']::varchar[]) f(fruit) ON true if so desired 
JOIN unnest(Books.tags) b(tags) ON b.tags = f.fruit; 

ブックの複数のタグが配列の値と一致すると、1つのブックに複数の行が表示されます。あなたはその使用を避けたい場合は、次の

SELECT name, tags, string_agg(fruit, ', ') AS query 
... 
GROUP BY name, tags; 
関連する問題