【问题标题】:Postgres SELECT * FROM Table where array has elementPostgres SELECT * FROM 数组有元素的表
【发布时间】:2014-02-11 15:48:17
【问题描述】:

我正在使用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""

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

【问题讨论】:

  • 您能否标准化您的数据库,使电子邮件和电话号码成为单独的字段?简单得多...
  • @n8wrl 我认为这是正确的方法,但很多时候我们不能这样做,因为很多原因(非技术原因)。 =)
  • @AndréFigueiredo:明白。这只是让我们回忆起过去我们将 XML 存储为 blob 的项目的糟糕回忆。无法搜索。标准化就是答案。

标签: sql arrays json psql


【解决方案1】:

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

我想你想要:

"Select * from contactTable where thejsonfield -> emails

修复完全损坏的 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 数组。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2014-02-28
      • 1970-01-01
      • 2016-11-21
      相关资源
      最近更新 更多