Используя НИЖНЕЕ с условием 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)
С возможными совпадениями в реальной таблице, теперь у нас есть возможность прописать обе стороны сравнения в нижнем регистре.