Как найти значения из списка в любом из нескольких столбцов - PullRequest
0 голосов
/ 12 мая 2019

У меня есть список числовых кодов (например, '110'), и я запрашиваю набор данных, который имеет 3 столбца crm_cd, crm_cd_1, crm_cd_2 ... Я пытаюсь найти любую запись, которая содержит любой из моих кодов в любом из 3 столбца.

Я не понимаю, должен ли я создать другой столбец и объединить 3 вместе, или я могу запросить, используя операторы OR - все, что я пытался, было безуспешно (например, давая мне астрономические подсчеты).

+----+--------+----------+----------+
| id | crm_cd | crm_cd_1 | crm_cd_2 |
+----+--------+----------+----------+
|  1 |    110 |      113 |          |
|  2 |    987 |      444 |      777 |
|  3 |    888 |      113 |      222 |
|  4 |    999 |      444 |          |
|  5 |    333 |      121 |      888 |
+----+--------+----------+----------+

    SELECT count (*)
    FROM public.crime
    WHERE date_occ >= '2017-06-01 00:00:00' 
      AND date_occ <= '2018-05-31 00:00:00'
    AND crm_cd IN ('110','113','121')
      OR crm_cd_1 IN ('110','113','121')      
      OR crm_cd_2 IN ('110','113','121');

Используя приведенный выше пример, я пытался получить записи 1,3, & 5.

Любое направление будет оценено.

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Более короткий способ написать это - использовать функцию массива Postgres:

WHERE date_occ BETWEEN '2017-06-01 00:00:00' AND '2018-05-31 00:00:00' 
  AND array[crm_cd, crm_cd_1, crm_cd_1] && array[110,113,121];

&& является оператором overlaps и возвращает true, если хотя бы одно значение с каждой стороны совпадает.

Также возможно создать индекс для выражения array[crm_cd, crm_cd_1, crm_cd_1]

0 голосов
/ 12 мая 2019

Вам нужны круглые скобки вокруг ограничений crm:

SELECT
    COUNT(*) AS cnt
FROM public.crime
WHERE
    date_occ BETWEEN '2017-06-01 00:00:00' AND '2018-05-31 00:00:00' AND
    (
        crm_cd IN ('110','113','121') OR
        crm_cd_1 IN ('110','113','121') OR
        crm_cd_2 IN ('110','113','121')
    );

Поскольку AND по умолчанию имеет более высокий приоритет, чем OR, именно так оценивается текущее предложение WHERE:

WHERE
    (date_occ BETWEEN '2017-06-01 00:00:00' AND '2018-05-31 00:00:00' AND
    crm_cd IN ('110','113','121')) OR
    crm_cd_1 IN ('110','113','121') OR
    crm_cd_2 IN ('110','113','121')

То есть любая запись, которая соответствует ограничению crm_cd_1 или crm_cd_2, независимо от ограничения по дате, будет засчитана как совпадение.Но ваша логика предназначена для того, чтобы и crm и ограничение даты были истинными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...