2013-07-10 5 views
5

मैं Postgres टोपी में एक सरणी खोज इस रूप में कम से कम एक टैग से मेल खाता है:Postgres सरणी उपसर्ग मिलान

SELECT * FROM users WHERE tags && ['fun']; 

| id | tags  | 
| 1 | [fun,day] | 
| 2 | [fun,sun] | 

यह उपसर्गों पर मैच के लिए संभव है? कुछ ऐसा:

SELECT * FROM users WHERE tags LIKE 'f%'; 

| id | tags  | 
| 1 | [fun,day] | 
| 2 | [fun,sun] | 
| 3 | [far]  | 
| 4 | [fin]  | 

उत्तर

4

कोशिश इस

create table users (id serial primary key, tags text[]); 

insert into users (tags) 
values 
    ('{"fun", "day"}'), 
    ('{"fun", "sun"}'), 
    ('{"test"}'), 
    ('{"fin"}'); 

select * 
from users 
where exists (select * from unnest(tags) as arr where arr like 'f%') 

SQL FIDDLE EXAMPLE

+0

खंड मौजूद है कि वह सही नहीं है - परिणाम देखें। पंक्तियों को जोड़ने के लिए बाहरी क्वेरी का संदर्भ गुम है। जोड़ने और 'id = u.id' जोड़ने का प्रयास करें (क्या "यू" बाहरी तालिका के लिए उपनाम है)। फिडल अपडेट किया गया: http://sqlfiddle.com/#!12/a6940/10/0 – bma

+0

मुझे पोस्टग्रेएसक्यूएल (ज्यादातर एसक्यूएल सर्वर में) में ज्यादा समय नहीं है, लेकिन मुझे पूरा यकीन है कि आप इसके बारे में गलत हैं, और बीटीडब्ल्यू मेरी क्वेरी sqlfiddle में सही परिणाम देता है। मौजूदियां मौजूदा पंक्ति टैग पर पहले से ही काम कर रही हैं, इसलिए आपकी आईडी = u.id. इस समय SQLFIDDLE नीचे है, इसलिए मैं इसे बाद में देखूंगा। –

+1

मूल रूप से मेरी क्वेरी को के रूप में फिर से लिखा जा सकता है, जहां से आप मौजूद हैं (चुनें * अननेस्ट (u.tags) से एआर के रूप में चुनें जहां 'f%' जैसे arr) ' –

3

यहां एक कामकाजी उदाहरण है जो आपको बाद में कम या ज्यादा प्राप्त करना चाहिए। ध्यान दें कि मैं यह दावा करते हुए नहीं कर रहा हूँ कि इस दृष्टिकोण पैमाने पर होगा ...

create table users (
id  serial primary key, 
tags text[] not null 
); 

insert into users (tags) values 
('{"aaaa","bbbb","cccc"}'::text[]), 
('{"badc","dddd","eeee"}'::text[]), 
('{"gggg","ffbb","attt"}'::text[]); 

select * 
from (select id,unnest(tags) arr from users) u 
where u.arr like 'a%'; 

id | arr 
----+------ 
    1 | aaaa 
    3 | attt 
संबंधित मुद्दे