Postgres SELECT * FROM Table其中array包含元素

时间:2014-02-11 15:48:18

标签: sql arrays json psql

我正在使用Postgres 9.3.2建立联系人的数据库。

示例:如果我的表格中有一行看起来像这样。

{
    firstName : "First name"
    lastName : "Last name"
    emails : ["email@one.com", "email@two.com", "email@three.com]
}

PS:firstName,lastName和emails是我的数据库中的列,相关的值是该特定行的该列的值。

我希望能够查询数据库,这样如果我查询电子邮件“email@four.com”,结果就是如果我查询“email@two.com”,结果将是上面的行条目。

我不认为查询

"Select * from contactTable where emails="email@two.com""

会奏效。相反,我想做像

这样的事情
"Select * from contactTable where emails contains "email@two.com""

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:3)

  

“从contactTable中选择*,其中电子邮件包含”email@two.com“”

我想你想要:

“从contactTable中选择*,其中thejsonfield - >电子邮件

示例设置,在修复完全损坏的json之后:

CREATE TABLE contacts AS SELECT '{
    "firstName" : "First name",
    "lastName" : "Last name",
    "emails" : ["email@one.com", "email@two.com", "email@three.com"]
}'::json AS myjsonfield;

以下内容适用于PostgreSQL 9.4,但由于缺少json_array_elements_text功能的监督,遗憾的是不会在9.3中出现:

select * 
from contacts, 
lateral json_array_elements_text(myjsonfield -> 'emails') email
where email = 'email@two.com';

对于9.3,你必须使用一种笨拙的方法来扫描json数组以寻找匹配的值:

select * 
from contacts, 
lateral json_array_length(myjsonfield -> 'emails') numemails, 
lateral generate_series(0, numemails) n 
WHERE json_array_element_text(myjsonfield -> 'emails', n) = 'email@two.com';

你不能使用简单的IN= ANY结构,因为(此时)PostgreSQL不明白你可能有一个json数组,所以它会失败:

regress=> SELECT * FROM contacts WHERE 'email@two.com' = ANY (myjsonfield->'emails');
ERROR:  op ANY/ALL (array) requires array on right side
LINE 1: SELECT * FROM contacts WHERE 'email@two.com' = ANY (myjsonfi...
                                                     ^

因为它需要PostgreSQL数组,而不是json数组,并且没有方便的内置来将json数组转换为PostgreSQL数组。

答案 1 :(得分:1)

Postgres支持解析JSON。这是文档:http://www.postgresql.org/docs/9.3/static/functions-json.html。由于您没有提供准确的数据和架构,我无法给您更详细的答案,但很容易在文档中找到正确的功能。