2017-04-13 117 views
1

如何检查一行中的任何数组值是否在我的列表中?
这是我的桌子。让我们把它叫做ABCPostgres检查是否有任何数组值在列表中

 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) 
+0

边注:尽量不使用保留字像'values'作为列名 –

回答

2

如果我正确的理解,你需要这样的:

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 
+0

只是出于好奇,你会怎么做在tsql中? –

+0

SQL Server有数组类型吗? –

+0

我不这么认为。 –

相关问题