Sql 在Postgres数据库中查询表中单个JSON列中两个键的组合

Sql 在Postgres数据库中查询表中单个JSON列中两个键的组合,sql,json,postgresql,Sql,Json,Postgresql,我正在使用一个数据库(运行Postgres 13)表,该表有一个JSON列,其结构大致如下: { first_name: 'Alex', last_name: 'Smith', my_other: 'info', ... } 我需要编写一个按用户全名搜索的查询(即,“{first_name}{last_name}”),但我不知道如何构建一个“虚拟化”的全名列,该列组合了名字键和姓氏键中的值。如果要测试JSON列是否同时包含名字和姓氏,可以执行以下操作: where the_co

我正在使用一个数据库(运行Postgres 13)表,该表有一个JSON列,其结构大致如下:

{
  first_name: 'Alex',
  last_name: 'Smith',
  my_other: 'info',
  ...
}

我需要编写一个按用户全名搜索的查询(即,
“{first_name}{last_name}”
),但我不知道如何构建一个“虚拟化”的全名列,该列组合了名字键和姓氏键中的值。

如果要测试JSON列是否同时包含名字和姓氏,可以执行以下操作:

where the_column @> '{"first_name": "Alex", "last_name": "Smith"}'::jsonb
SELECT (col->>'first_name') || ' ' || (col->>'last_name') FROM A

这假设您的JSON列的类型是
jsonb
(应该是)。如果不是,则需要强制转换:
列::jsonb

如果要测试JSON列是否同时包含名字和姓氏,可以执行以下操作:

where the_column @> '{"first_name": "Alex", "last_name": "Smith"}'::jsonb
SELECT (col->>'first_name') || ' ' || (col->>'last_name') FROM A

这假设您的JSON列的类型是
jsonb
(应该是)。如果不是,则需要强制转换:
列::jsonb

您只需要使用
|
操作符将两个值连接起来。如果json列名为
col
,表名为
A
,则可以执行以下操作:

where the_column @> '{"first_name": "Alex", "last_name": "Smith"}'::jsonb
SELECT (col->>'first_name') || ' ' || (col->>'last_name') FROM A
->
操作符从json对象中提取一个字段作为
文本,即您想要的内容。(我使用了一些括号,因为现在我不记得
|
->
之间的优先级。)


另外,请注意,如果您只想检查json列是否包含两个属性,那么you不需要“虚拟化”全名。您只需使用
@
(或
即可,您只需使用
|
运算符将这两个值连接起来。如果json列命名为
col
,表名为
A
,则您可以执行以下操作:

where the_column @> '{"first_name": "Alex", "last_name": "Smith"}'::jsonb
SELECT (col->>'first_name') || ' ' || (col->>'last_name') FROM A
->
操作符从json对象中提取一个字段作为
文本,即您想要的内容(我使用了一些括号,因为现在我不记得
|
->
之间的优先级)

另外,请注意,如果您只想检查json列是否包含两个属性,那么you不需要“虚拟化”全名。您可以使用
@>
(或