PostgreSql 查询数组值
PostgreSql Querying Array Values
我将以下 JSON 格式存储为 postgresql 中的 JSONB 列。
{DisplayName":"Bob marley","FName":"Bob","Title":null,"LName":"Marley","State":null,"EmailAddresses":["bob.marley@hotmail.com","bobmarley@gmail.com"]},
{DisplayName":"Bob martin","FName":"Bob ","Title":null,"LName":"Martin","State":null,"EmailAddresses":["bob.martin@hotmail.com","bobmartin@gmail.com"]}
我想查询以 Bob 开头的 EmailAddresses 数组。我能够使用 LIKE 和 ILIKE 运算符查询普通字符串类型的键,但是要在 ARRAY 类型中搜索,就会出现问题。
请指教
如果您想检查 jsonb 字段中数组的任何元素是否与您的掩码匹配:
SELECT *
FROM jtable
WHERE EXISTS (
SELECT 1
FROM jsonb_array_elements_text(jfield->'EmailAddresses') AS j
WHERE j ~ 'bob'
)
jfield
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"FName": "Bob", "LName": "Marley", "State": null, "Title": null, "DisplayName": "Bob marley", "EmailAddresses": ["bob.marley@hotmail.com", "bobmarley@gmail.com"]}
{"FName": "Bob ", "LName": "Martin", "State": null, "Title": null, "DisplayName": "Bob martin", "EmailAddresses": ["bob.martin@hotmail.com", "bobmartin@gmail.com"]}
(2 rows)
或者如果您想要匹配掩码的电子邮件列表:
WITH w AS (
SELECT jsonb_array_elements_text(jfield->'EmailAddresses') AS emails,
*
FROM jtable
)
SELECT * FROM w WHERE emails ~ 'bobm'
emails | jfield
---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------
bobmarley@gmail.com | {"FName": "Bob", "LName": "Marley", "State": null, "Title": null, "DisplayName": "Bob marley", "EmailAddresses": ["bob.marley@hotmail.com", "bobmarley@gmail.com"]}
bobmartin@gmail.com | {"FName": "Bob ", "LName": "Martin", "State": null, "Title": null, "DisplayName": "Bob martin", "EmailAddresses": ["bob.martin@hotmail.com", "bobmartin@gmail.com"]}
(2 rows)
我将以下 JSON 格式存储为 postgresql 中的 JSONB 列。
{DisplayName":"Bob marley","FName":"Bob","Title":null,"LName":"Marley","State":null,"EmailAddresses":["bob.marley@hotmail.com","bobmarley@gmail.com"]},
{DisplayName":"Bob martin","FName":"Bob ","Title":null,"LName":"Martin","State":null,"EmailAddresses":["bob.martin@hotmail.com","bobmartin@gmail.com"]}
我想查询以 Bob 开头的 EmailAddresses 数组。我能够使用 LIKE 和 ILIKE 运算符查询普通字符串类型的键,但是要在 ARRAY 类型中搜索,就会出现问题。 请指教
如果您想检查 jsonb 字段中数组的任何元素是否与您的掩码匹配:
SELECT *
FROM jtable
WHERE EXISTS (
SELECT 1
FROM jsonb_array_elements_text(jfield->'EmailAddresses') AS j
WHERE j ~ 'bob'
)
jfield
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"FName": "Bob", "LName": "Marley", "State": null, "Title": null, "DisplayName": "Bob marley", "EmailAddresses": ["bob.marley@hotmail.com", "bobmarley@gmail.com"]}
{"FName": "Bob ", "LName": "Martin", "State": null, "Title": null, "DisplayName": "Bob martin", "EmailAddresses": ["bob.martin@hotmail.com", "bobmartin@gmail.com"]}
(2 rows)
或者如果您想要匹配掩码的电子邮件列表:
WITH w AS (
SELECT jsonb_array_elements_text(jfield->'EmailAddresses') AS emails,
*
FROM jtable
)
SELECT * FROM w WHERE emails ~ 'bobm'
emails | jfield
---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------
bobmarley@gmail.com | {"FName": "Bob", "LName": "Marley", "State": null, "Title": null, "DisplayName": "Bob marley", "EmailAddresses": ["bob.marley@hotmail.com", "bobmarley@gmail.com"]}
bobmartin@gmail.com | {"FName": "Bob ", "LName": "Martin", "State": null, "Title": null, "DisplayName": "Bob martin", "EmailAddresses": ["bob.martin@hotmail.com", "bobmartin@gmail.com"]}
(2 rows)