Используя НИЖНЕЕ с условием IN

Предположим, у меня есть таблица с именем comodity_group и структура выглядит так:

+----------+-------+
| group_id | name  |
+----------+-------+
| 1        | Data1 |
+----------+-------+
| 2        | Data2 |
+----------+-------+
| 3        | data3 |
+----------+-------+

и у меня есть следующий запрос

SELECT * FROM comodity_group WHERE name IN('data1','data2','data3')

запрос возвращает результат 0, потому что условие все в нижнем регистре (обратите внимание, что условие также является динамическим, то есть это может быть Data1 или daTa1 и т. д.)

поэтому я хочу сделать условие и имя поля в нижнем регистре, другими словами без учета регистра.

3 ответа

Ты можешь использовать ILIKE и массив:

select *
from comodity_group
where name ilike any (array['Data1', 'data2', 'dATA3']);

Обратите внимание, что это будет не очень быстро, так как оператор ILIKE не может использовать обычный индекс на name колонка.

Вы можете преобразовать данные вашего имени в нижний регистр

SELECT * FROM comodity_group WHERE lower(name) IN('data1','data2','data3')

Предполагая, что у вас есть контроль над условиями, которые появляются в IN пункт вашего запроса, то вам нужно только в нижнем регистре name столбец перед проведением сравнения:

SELECT *
FROM commodity_group
WHERE LOWER(name) IN ('data1', 'data2', 'data3')

Вдобавок ко всему, вы также можете присоединиться к встроенной таблице, содержащей условия поиска:

WITH cte AS (
    SELECT 'daTa1' AS name
    UNION ALL
    SELECT 'Data2'
    UNION ALL
    SELECT 'datA3'
)
SELECT *
FROM commodity_group t1
INNER JOIN cte t2
    ON LOWER(t1.name) = LOWER(t2.name)

С возможными совпадениями в реальной таблице, теперь у нас есть возможность прописать обе стороны сравнения в нижнем регистре.

Другие вопросы по тегам