2016-04-05 17 views
1

Eşleşen dizenin dizi konumunu aramaya çalışıyorum, bir dizide bir karakterin konumu olan bir dizinin var olduğunu görüyorum, ancak burada bir diziyle değilPostgreSQL 9.5 dizisinde dize eşleşmesinin konumu

[1,4] 

Ben: sonuçta aşağıdaki gibi bir şey olmalı bu yüzden kelime 'patates' içeren unsurlardır nerede olduğunu bilmek istiyorum

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

: Ben elde etmek istediğinizi bir örnektir tüm elemanların uzunluklarını elde etmeye çalışmak, sonra diziyi dizeye dönüştürmek ve dizeyi dizinin, dizi elemanlarının uzunlukları arasında gidip gelebileceği ile eşleştiğini ve karşılaştırılacağını, ancak dizideki öğe sayımın değişkendiyse ve bu benim sorunumda bu işe yaramayacağını görmek. Eğer tam eşleme kullanımını array_positions istiyorsanız

cevap

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']); 

Sorgu:

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

Çıktı: Eğer wildcard ile LIKE aramayı kullanmak istiyorsanız

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

sen yapabilir misin 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; 

Çıkış:

╔════╦════════╗ 
║ id ║ result ║ 
╠════╬════════╣ 
║ 1 ║ {1,4} ║ 
║ 2 ║ {1} ║ 
╚════╩════════╝