Postgresql 在条件允许的情况下使用LOWER

Postgresql 在条件允许的情况下使用LOWER,postgresql,Postgresql,假设我有一个名为comodity\u group的表,其结构如下所示: +----------+-------+ | group_id | name | +----------+-------+ | 1 | Data1 | +----------+-------+ | 2 | Data2 | +----------+-------+ | 3 | data3 | +----------+-------+ 我有以下疑问 SELECT * FROM com

假设我有一个名为
comodity\u group
的表,其结构如下所示:

+----------+-------+
| group_id | name  |
+----------+-------+
| 1        | Data1 |
+----------+-------+
| 2        | Data2 |
+----------+-------+
| 3        | data3 |
+----------+-------+
我有以下疑问

SELECT * FROM comodity_group WHERE name IN('data1','data2','data3')
查询返回0结果,因为条件都是小写的(请注意,条件也是动态的,这意味着它可以是Data1或Data1等)


因此,我想将条件和字段名都设置为小写,换句话说,不区分大小写。

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

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)

有了实际表中可能的匹配项,我们现在可以将比较的两侧小写。

您可以使用
ILIKE
和数组:

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

请注意,这不会很快,因为ILIKE操作符无法使用
name
列上的常规索引

条件本身可以是动态的,如('daTa1','Data2','datA3')中的
。我无法控制
子句中的
中的术语。您是否使用动态SQL?更新您的问题,使其更清楚。@TimBiegeleisen:问题中已经有了“注意,条件也是动态的,意味着它可以是Data1或Data1等”,这就是我要找的。多谢各位@DarielPratama如果这个答案对你有帮助,你应该把它标为正确答案。你也可以对你认为有用的任何其他答案进行投票。是的,我这样做了,但我不知道我的答案。当复选标记应该是绿色时,它仍然是灰色的。