2016-04-05 5 views
1

一致する文字列の配列位置を検索しようとしていますが、文字列上の文字の位置はありますが、配列の文字列はありません。私が達成したいものの一例である:PostgreSQL 9.5アレイでの文字列一致の位置

array['potato-salad','cucumber-salad','eggplant-pie','potato-soup'] 

私は単語「ポテト」を含む要素があるので、結果はこのようなものであるべきところを知りたい:

[1,4] 

私がされましたすべての要素の長さを取得し、配列を文字列に変換し、文字列を検索する文字列が一致する場所を見て、配列要素の長さの間に位置が入るかどうか比較しますが、配列の要素数が可変で、問題がある場合は機能しません。あなたが完全一致使用array_positionsをしたい場合は

答えて

1

CREATE TABLE my_tab(ID INT, col VARCHAR(100)[]); 

INSERT INTO my_tab(ID, col) 
VALUES (1, array['potato-salad','cucumber-salad','eggplant-pie','potato-soup']), 
     (2, array['potato']); 

問合せ:

SELECT * 
FROM my_tab 
,LATERAL array_positions(col, 'potato-salad') AS s(potato_salad_position) 
WHERE s.potato_salad_position <> '{}'; 

出力:あなたは、ワイルドカードでLIKE検索を使用する場合は

╔════╦════════════════════════════════════════════════════════╦═══════════════════════╗ 
║ id ║       col       ║ potato_salad_position ║ 
╠════╬════════════════════════════════════════════════════════╬═══════════════════════╣ 
║ 1 ║ {potato-salad,cucumber-salad,eggplant-pie,potato-soup} ║ {1}     ║ 
╚════╩════════════════════════════════════════════════════════╩═══════════════════════╝ 

ますあなたはできましたSE unnest WITH ORDINALITY

SELECT id, array_agg(rn) AS result 
FROM my_tab 
,LATERAL unnest(col) WITH ORDINALITY AS t(val,rn) 
WHERE val LIKE '%potato%' 
GROUP BY id; 

出力:

╔════╦════════╗ 
║ id ║ result ║ 
╠════╬════════╣ 
║ 1 ║ {1,4} ║ 
║ 2 ║ {1} ║ 
╚════╩════════╝ 
関連する問題