Выберите запрос в postgresql, чтобы избежать нулевых значений столбца jsonb - PullRequest
0 голосов
/ 08 июня 2018

Я использую JPA для получения данных из базы данных Postgres путем запроса таблицы.Один из столбцов моей таблицы - jsonb.И фрагмент столбца jsonb из этой таблицы выглядит так:

{"name": "Robert", "surname": "Lewandowski", "app_number": "46323875"}
{"name": "Robert", "surname": null, "app_number": "46323876"}
{"name": "Franck", "surname": "Ribery", "app_number": "46323877"}

Я хотел бы реализовать фильтрацию и исключить нулевые значения в результате.Чтобы сделать это, я запрашиваю таблицу, используя этот фрагмент кода:

  @Query(value = "SELECT * FROM request_data rd\n" +
        "         WHERE(rd.params ->> 'name' = NULLIF(?1,'') is NULL or (rd.params ->> 'name' = ?1 and rd.params ->> 'name' != 'null'))\n" +
        "         and (rd.params ->> 'surname' = NULLIF(?2,'') is NULL or (rd.params ->> 'surname' = ?2 and rd.params ->> 'surname' != 'null'))\n" +
        "         and (rd.params ->> 'app_number' = NULLIF(?3,'') is NULL or (rd.params ->> 'app_number' = ?3 and rd.params ->> 'app_number' != 'null')) order by created_at DESC", nativeQuery = true)
List<RequestData> findTest(String name, String surname, String appNumber);

Например, я хотел бы получить все записи по surname = "Lewandowski", и я ожидаю следующеерезультат:

{"name": "Robert", "surname": "Lewandowski", "app_number": "46323875"}

Но вместо него я получил две строки, в том числе surname = null

{"name": "Robert", "surname": "Lewandowski", "app_number": "46323875"}
{"name": "Robert", "surname": null, "app_number": "46323876"}

Я пробовал несколько разных запросов и синтаксисов, но пока не могуизбавиться от нулевых значений в моем результате.

1 Ответ

0 голосов
/ 08 июня 2018

Вероятно, что-то вроде этого будет работать:

AND (rd.params->>'surname') IS NOT DISTINCT FROM NULLIF(?2, '')

Если фамилия null, "Lewandowski" будет отличаться от него, поэтому не будет возвращен.Если запрашиваемая фамилия '' или NULL, фамилия null будет возвращена, что, я полагаю, именно то, что вам нужно.И, наконец, если фамилия «Левандовски» и запрашиваемая фамилия одна и та же, она не будет отличимой, и поэтому верните этот результат.

Эта проверка - все, что вам нужно для проверки всей фамилии.Проверка rd.params ->> 'surname' != 'null' кажется мне неправильной, потому что это фактическое текстовое значение «null», и как вы узнаете, что ни у кого нет фамилии под названием «null»?Это не то же самое, что проверка null.

Этот же метод можно применить и к другим полям.

...