sql - 如何跳过sql中的case语句?

标签 sql postgresql select case

我在 Postgresql 中使用 sql 语句。在我的声明中是一个 case 表达式。如果 case 语句不被接受,我如何跳过一行

代码:

SELECT *
FROM (SELECT a.link_id AS LinkID,

CASE
    WHEN a.From_Ref_Speed_Limit is null and a.To_Ref_Speed_Limit is not null THEN a.To_Ref_Speed_Limit
    WHEN a.From_Ref_Speed_Limit is not null and a.To_Ref_Speed_Limit is null THEN a.From_Ref_Speed_Limit
    WHEN a.From_Ref_Speed_Limit < a.To_Ref_Speed_Limit THEN a.To_Ref_Speed_Limit
    WHEN a.From_Ref_Speed_Limit > a.To_Ref_Speed_Limit THEN a.From_Ref_Speed_Limit
    WHEN a.From_Ref_Speed_Limit = a.To_Ref_Speed_Limit THEN a.To_Ref_Speed_Limit
    ELSE 0 --unknown
END as SpeedLimit,...

如果我的案例陈述中没有任何条件是有罪的,它应该跳过该行并选择下一个。 就像在其他情况下它不应该返回 NULL 它应该跳过该行并且应该继续下一个。 我怎样才能意识到这一点?

最佳答案

您的案例可以替换为greatestlateral避免嵌套查询:

select *
from
    a
    inner join lateral (
        select greatest(a.From_Ref_Speed_Limit, a.To_Ref_Speed_Limit) as SpeedLimit
    ) s on s.SpeedLimit is not null
;
 from_ref_speed_limit | to_ref_speed_limit | speedlimit 
----------------------+--------------------+------------
                    1 |                  0 |          1
                    0 |                  1 |          1
                      |                  1 |          1
                    0 |                    |          0

对于 9.4 之前的版本(无横向),需要嵌套查询:

with a (From_Ref_Speed_Limit, To_Ref_Speed_Limit) as ( values
    (1,0),(0,1),(null,1),(0,null),(null,null)
)
select *
from (
    select a.*, greatest(a.From_Ref_Speed_Limit, a.To_Ref_Speed_Limit) as SpeedLimit
    from a
) s
where s.SpeedLimit is not null
;

关于sql - 如何跳过sql中的case语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43091249/

相关文章:

带有 Selenium 的 Python 下拉列表

sql - PSQL为每个ID每分钟选择多个值每分钟每个ID的最大值?

sql - 内部数据库错误:SQLDA丢失或版本不正确,或变量的数量/类型不正确

sql - 根据另一个字段的代码聚合一个字段中的多个值

postgresql - PostgreSQL 中基于游标的记录

python - 高效地将 s3 文件处理到 Postgres 中

select - swiper插件导致选择无法弹出下拉框

sql - T-SQL中没有名称的输入参数

sql - 明确区分pg_stat_statements中的相似查询?

java - 如何在 Oracle 数据库中使用 JDBC 中的日期和时间