Postgres sql 中“in”运算符的使用

问题描述 投票:0回答:1

我使用“with”子句创建了一个 CTE,并且使用 casewhen 表达式来填充 CTE 中的列,并且我想使用 casewhen 表达式 in where 条件的结果作为条件值来使用“in”获取结果操作员。

当存在诸如 Range1Range2 之类的值与表的列值匹配时,查询将产生正确的结果。我想使用 postgreSQL 的 where 子句中的 in 运算符 来基于值的组合(例如 Range1,Range2Range3,Range4)获取结果。我尝试创建以下情况,但它没有给我结果。

with sampleq as(
select case when trim(to_char(current_date,'Day')) like 'Monday' then '''Range1'',''Range2'',''Range3'''
        when trim(to_char(current_date,'Day')) like 'Tuesday' then '''Range4'',''Range5,''Range6'''
        when trim(to_char(current_date,'Day')) like 'Wednesday' then '''Range7'',''Range8,''Range9'''
        when trim(to_char(current_date,'Day')) like 'Thursday' then '''Range10'',''Range11'''
        when trim(to_char(current_date,'Day')) like 'Friday' then '''Range12'',''Range13'''
        else ' ' end as Rangecriteria
  ,Column1,column2 from sampletable

)select * from sampleq where column2 in (Rangecriteria)

通常,如果我使用以逗号分隔的字符串'in运算符'效果很好。但是,如果我使用列根据条件填充值并使用它“在运算符中”,它不起作用。您能帮我在这里找到解决方案吗?

提前致谢, S Ch 阿维纳什

postgresql where-clause common-table-expression in-operator
1个回答
0
投票

您的方法不起作用,因为您本质上期望 PostgreSQL 将字符串视为代码。 PostgreSQL 如何知道

'1, 2'
是否意味着您要查找包含数字
1
2
的行还是文字
1, 2
文本?

最明显的解决方案是拥有一个包含所有这些范围定义的主表。如果你不需要表格,你也可以用 CTE 来模拟:

WITH range_definition (weekday, "range") AS (
    SELECT 'Monday', 'Range1'
    UNION ALL SELECT 'Monday', 'Range2'
    UNION ALL SELECT 'Monday', 'Range3'
    UNION ALL SELECT 'Tuesday', 'Range6'
    -- ...
), DATA (weekday, column2) AS (
    SELECT 'Monday', 123
    UNION ALL SELECT 'Tuesday', 456
)
SELECT *
FROM DATA 
INNER JOIN range_definition ON DATA.weekday = range_definition.weekday;

然后,您可以使用常规

IN
运算符进行常规查询。

© www.soinside.com 2019 - 2024. All rights reserved.