在IN情况下使用LOWER

时间:2017-01-17 06:54:08

标签: postgresql

假设我有一个名为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 个答案:

答案 0 :(得分:0)

您可以将您的姓名数据转换为小写

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

答案 1 :(得分:0)

假设您可以控制查询的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)

通过实际表中可能的匹配,我们现在能够小写比较的两边。

答案 2 :(得分:0)

您可以使用ILIKE和数组:

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

请注意,由于ILIKE运算符无法在name列上使用常规索引,因此不会很快。