根据相同的条件语句选择两列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的主要内容,如果未能解决你的问题,请参考以下文章

当查询条件不确定的时候,怎么写SQL 语句

从表中的两列中选择相同的数据,并使用一条sql语句显示所有数据

如何根据不同的条件执行不同的SQL语句

SQL根据条件执行不同的语句

笔记:MyBatis 动态SQL

Oracle---------sql 中取值两列中值最大的一列