Как получить доступ к указанному c json полю в операторе select вместе с функцией count? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь получить доступ к указанному разделу c поля JSON в PostgreSQL с помощью функции count, чтобы получить носители со статусом альтернативного текста, присутствует или нет.

Таблицы с данными:

свойства

id cid property_name
1  11   abc
2  11   pqr
3  11   xyz
4  11   ddd
5  11   eee
6  11   fff

marketing_media_associations

id cid property_id media_path   details
1   11    1          path1      {"filemeta1":"aa", "media_alt":"media alt text", "filemeta2":"meta2 text"}
2   11    2          path1      {"filemeta1":"aa", "filemeta2":"meta2 text"}
3   11    3          path1      {"filemeta1":"aa", "media_alt":"media alt text2", "filemeta2":"meta2 text"}
4   11    6          path1      {"filemeta1":"aa", "filemeta2":"meta2 text"}
5   11    6          path1      {"filemeta1":"aa", "media_alt":"media alt text2", "filemeta2":"meta2 text"}

Ожидаемый результат:

id property_name media_alt
1   abc          YES
2   pqr          NO
3   xyz          YES
4   ddd          -
5   eee          -
6   fff          YES

Я пытаюсь выполнить следующий запрос, но он не дает мне ожидаемый результат.

SELECT p.id, p.property_name,
            (CASE WHEN COUNT(mma.details->'media_alt' ) > 0 THEN 'YES'
            WHEN COUNT(mma.cid) > 0 THEN 'NO'
            ELSE '-'
            END) as media_alt
FROM properties p
LEFT JOIN marketing_media_associations mma ON ( mma.property_id = p.id AND mma.cid = p.cid )
GROUP BY p.id, p.property_name ORDER BY p.property_name

Как правильно SQL похож?

1 Ответ

0 голосов
/ 13 февраля 2020

Вам нужно использовать условие IS NULL вместо count: (этот запрос действителен только для отдельного случая marketing_media_associations для каждого свойства)

SELECT 
    p.id, 
    p.property_name,
    (CASE 
        WHEN mma.cid IS NULL THEN '-' -- no matched row in mma table
        WHEN mma.details->'media_alt' IS NULL THEN 'NO' -- json key not exists in exists row
        ELSE 'YES'
    END) as media_alt
FROM properties p
LEFT JOIN marketing_media_associations mma ON ( mma.property_id = p.id AND mma.cid = p.cid )
ORDER BY p.property_name;
...