我使用“with”子句创建了一个 CTE,并且使用 casewhen 表达式来填充 CTE 中的列,并且我想使用 casewhen 表达式 in where 条件的结果作为条件值来使用“in”获取结果操作员。
当存在诸如 Range1 或 Range2 之类的值与表的列值匹配时,查询将产生正确的结果。我想使用 postgreSQL 的 where 子句中的 in 运算符 来基于值的组合(例如 Range1,Range2 或 Range3,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 将字符串视为代码。 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
运算符进行常规查询。