2017-02-19 8 views
0

У меня есть следующий формат JSON, который хранится в столбце JSONB в postgresql.PostgreSql Querying Array Values ​​

{DisplayName":"Bob marley","FName":"Bob","Title":null,"LName":"Marley","State":null,"EmailAddresses":["[email protected]","[email protected]"]}, 
{DisplayName":"Bob martin","FName":"Bob ","Title":null,"LName":"Martin","State":null,"EmailAddresses":["[email protected]","[email protected]"]} 

Я хочу запросить адрес электронной почты, где он начинается с Боба. Я могу запросить обычные клавиши строкового типа с помощью операторов LIKE и ILIKE, однако для поиска внутри типов ARRAY возникает проблема. Просьба сообщить.

ответ

1

Если вы хотите проверить, если какой-либо элемент массива в 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": ["[email protected]", "[email protected]"]} 
{"FName": "Bob ", "LName": "Martin", "State": null, "Title": null, "DisplayName": "Bob martin", "EmailAddresses": ["[email protected]", "[email protected]"]} 
(2 rows) 

Или, если вы хотите, список электронной почты, которые соответствуют по маске:

WITH w AS (
    SELECT jsonb_array_elements_text(jfield->'EmailAddresses') AS emails, 
      * 
     FROM jtable 
) 
SELECT * FROM w WHERE emails ~ 'bobm' 


     emails  |                    jfield                     
---------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
[email protected] | {"FName": "Bob", "LName": "Marley", "State": null, "Title": null, "DisplayName": "Bob marley", "EmailAddresses": ["[email protected]", "[email protected]"]} 
[email protected] | {"FName": "Bob ", "LName": "Martin", "State": null, "Title": null, "DisplayName": "Bob martin", "EmailAddresses": ["[email protected]", "[email protected]"]} 
(2 rows) 
+0

Великой, большое спасибо – puneet