我正在使用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""
关于如何做到这一点的任何想法?
答案 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。由于您没有提供准确的数据和架构,我无法给您更详细的答案,但很容易在文档中找到正确的功能。