如何在sql中跳过case语句?

如何在sql中跳过case语句?,sql,postgresql,select,case,Sql,Postgresql,Select,Case,我正在Postgresql中使用sql语句。在我的陈述中有一个case表达式。如果case语句不是acceptet,如何跳过一行 代码: 选择* 从(选择一个.link\u id作为LinkID, 案例 当a.From\u Ref\u Speed\u Limit为空且a.To\u Ref\u Speed\u Limit不为空时,则a.To\u Ref\u Speed\u Limit为空 当a.From\u Ref\u Speed\u Limit不为空且a.To\u Ref\u Speed\u L

我正在Postgresql中使用sql语句。在我的陈述中有一个case表达式。如果case语句不是acceptet,如何跳过一行

代码:

选择*
从(选择一个.link\u id作为LinkID,
案例
当a.From\u Ref\u Speed\u Limit为空且a.To\u Ref\u Speed\u Limit不为空时,则a.To\u Ref\u Speed\u Limit为空
当a.From\u Ref\u Speed\u Limit不为空且a.To\u Ref\u Speed\u Limit为空时,则a.From\u Ref\u Speed\u Limit
当a.自参考速度限制a.至参考速度限制时,则a.自参考速度限制
当a.From_Ref_Speed_Limit=a.To_Ref_Speed_Limit时,则a.To_Ref_Speed_Limit
ELSE 0—未知
以限速结束,。。。
如果我的案例陈述中没有任何条件是有罪的,它应该跳过该行并选择下一行。 与case-else一样,它不应该返回NULL,它应该跳过该行并继续下一行。
如何实现这一点?

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

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
;

只需在外部查询中添加一个
WHERE SpeedLimit 0
,即可过滤掉不需要的行。啊,这是多么容易…=)谢谢lot@GiorgosBetsos解决方案是好的。但感觉这可能是一个常见问题,即在某些计算条件下删除行。在这种情况下是否有短路评估的方法:
calc1,如果cond1(calc1)跳过行else calc2,如果cond2(calc2)跳过行else calc3并返回calc1,calc2,calc3
。在没有多个嵌套查询的情况下执行此操作应该很有趣。任何人在不同的数据库上,这是可能的吗?@DanGetz没有RDBMS支持这种功能,因为SQL是基于设置的,而不是基于过程的。因此,您必须首先计算所有圆锥数据,然后将其用于过滤,甚至用于确定将要选择的记录的优先级。出现错误:错误:语法错误位于或接近“选择”行3:连接横向(选择)(a.From\u Ref\u Speed\u Limit,a.To\R…@Moehre缺少子查询别名。现在已修复。@Moehre我发布了示例数据。Postgresql版本是什么?
select version()
Postgresql 9.2.4 onx86@Moehre
lateral
如果是9.4功能。我更新了可用的9.2版本。
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
;