簡體   English   中英

Postgres檢查列表中是否有任何數組值

[英]Postgres check if any of array values is in a list

如何檢查列表中是否有單行中的任何數組值?
這是我的桌子。 我們稱之為ABC

        id        |   page_id   |                                  values                                   
------------------+-------------+-------------------------------------------------------------------------
 1376092679147519 |     xyz     | {6004036173148,6003373173651,6003050657850}
 1375487155874738 |     xyz     | {6003301698460,6003232518610}
 1497527026945449 |     xyz     | {6003654559478,6003197656807}
 1375388575884596 |     xyz     | {6003512053894,6003450241842,6003051414416}
 1319144441504401 |     xyz     | {6004001256506,6003514818642,6003400993421}

我的目的是選擇那些行,其中一個值出現在給定列表中(“ 6004036173148”,“ 6003197656807”)。

SELECT id, page_id, values from ABC WHERE -SOME CLAUSE- IN ('6004036173148', '6003197656807');

        id        |   page_id   |                                  values                                   
------------------+-------------+-------------------------------------------------------------------------
 1376092679147519 |     xyz     | {6004036173148,6003373173651,6003050657850}
 1497527026945449 |     xyz     | {6003654559478,6003197656807}

這是我的PosgreSQL表的結構

                             Table "public.ABC"
       Column       |           Type           |       Modifiers        
--------------------+--------------------------+------------------------
 id                 | character varying        | not null
 page_id            | character varying        | not null
 values             | character varying[]      | 
Indexes:
    "ABC_pkey" PRIMARY KEY, btree (id)

如果我正確理解,則需要這樣做:

select * from t
where "values" && '{6004036173148,6003197656807}'::character varying[]

編輯

如果您需要提取某些值,則可以使用unnest函數

請注意,如果同一數組包含來自搜索列表的多個值,則將重復行。 看一下id=2示例輸出,您可以看到我在說什么:

with t(id, values) as(
    select 1, '{6004036173147,6003373173651,6003050657840}'::character varying[]
    union all
    select 2, '{6004036173148,6003373173652,6003050657850}'::character varying[]
    union all
    select 3, '{6004036173149,6003373173653,6003050657860}'::character varying[]
)


select tt.* from  
(select t.*, unnest(values) unn from t) tt
inner join (select unnest('{6003373173651,6004036173148,6003373173652}'::character varying[]) v  ) lst
on tt.unn = lst.v

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM