我在 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 它应该跳过该行并且应该继续下一个。 我怎样才能意识到这一点?
最佳答案
您的案例
可以替换为greatest
和 lateral
避免嵌套查询:
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/