根据相同的条件语句选择两列SQL
Posted
技术标签:
【中文标题】根据相同的条件语句选择两列SQL【英文标题】:Select two columns based on the same conditional statement SQL 【发布时间】:2014-10-13 15:04:47 【问题描述】:我有一个类似于这样的选择语句
SELECT
CASE WHEN <SOME-CONDN_1> THEN 'value1' ELSE '' ||
CASE WHEN <SOME-CONDN_2> THEN 'value2' ELSE '' ||
CASE WHEN <SOME-CONDN_3> THEN 'value3' ELSE '' AS value_column,
CASE WHEN <SOME-CONDN_1> THEN 'name1' ELSE '' ||
CASE WHEN <SOME-CONDN_2> THEN 'name2' ELSE '' ||
CASE WHEN <SOME-CONDN_3> THEN 'name3' ELSE '' AS name_column
FROM data_table
--<REST OF THE QUERY>
条件语句类似于data_table.data_column ILIKE value1
等等。
由于我两次执行相同的条件语句(并且它涉及使用ILIKE
进行一些字符串匹配),我想知道是否可以将它们加入俱乐部并提高效率。
使用 SQL 语句也可以吗?
【问题讨论】:
就语法而言,这往往会很快成为特定于供应商的 - 你在问什么供应商? 我正在使用 Redshift 数据库。它主要使用 PostGreSQL。 Redshift 是一个分析型数据库,能够针对数十亿条记录优化查询。存储文本数据和进行字符串操作并不是最佳实践。请考虑使用一些预处理来解析您的数据并将其放入正确的列,而不是上述复杂且缓慢的查询。 【参考方案1】:选项 1:不太确定这种 CASE 变体是否适用于 PostgreSQL...
select case cond_num when
1 then 'value1'
when 2 then 'value2',
when 3 then 'value3' else null end as value_column,
case cond_num when
1 then 'name1'
when 2 then 'name2',
when 3 then 'name3' else null end as name_column
from (
select data_table.*,
case when <some_condition_1> then 1
when <some_condition_2> then 2
when <some_condition_3> then 3 else 0 end as cond_num
from data_table
) screened_table
;
选项 2:
select case when
cond1 = 1 then 'value1'
when cond2 = 1 then 'value2',
when cond3 = 1 then 'value3' else null end as value_column,
case when
cond1 = 1 then 'name1'
when cond2 = 1 then 'name2',
when cond3 = 1 then 'name3' else null end as name_column
from (
select data_table.*,
case when <some_condition_1> then 1 else 0 as cond1,
case when <some_condition_2> then 1 else 0 as cond2,
case when <some_condition_3> then 1 else 0 as cond3
from data_table
) screened_table
;
选项 3 - 请注意,如果条件不是排他性的,则可能会返回多行。不会从 data_table 中返回不符合条件的行。
select rslt.name, rslt.value
from data_table, (
select 1 as cond, 'value1' as value, 'name1' as name
union all
select 2 as cond, 'value2' as value, 'name2' as name
union all
select 3 as cond, 'value3' as value, 'name3' as name
) rslt
WHERE (<some_condition_1> and rslt.cond = 1) OR
(<some_condition_2> and rslt.cond = 2) OR
(<some_condition_3> and rslt.cond = 3)
;
【讨论】:
【参考方案2】:假设结果都是字符串,您可以使用数组来简化操作。
SELECT a[1],a[2], ...
FROM (SELECT CASE
WHEN <SOME-CONDN_1> THEN ARRAY['value1','name1']
WHEN <SOME-CONDN_2> THEN ARRAY['value2','name2']
WHEN <SOME-CONDN_3> THEN ARRAY['value3','name3']
ELSE '' AS a
FROM ...
);
如果结果值不是全部相同的类型,您可以使用 ROW() 构造函数执行相同的操作,但您需要定义一个类型以便单独“退出行”获取值。
【讨论】:
不幸的是 redshift 不支持数组。否则,这是完美的解决方案。 docs.aws.amazon.com/redshift/latest/dg/…以上是关于根据相同的条件语句选择两列SQL的主要内容,如果未能解决你的问题,请参考以下文章