我想在查询中选择一个id作为基于条件的orderid。 如果它存在于具有条件parentid = childid的另一个表ode中。然后我应该返回那个孩子的身份证。否则我将从另一个表ml
中选择id为此我写了这个查询并按预期返回数据。
CASE
WHEN (SELECT COUNT(childid) FROM ode WHERE ode.parentid= ode.childid)>0
THEN CAST((SELECT ode.childid FROM ode WHERE ode.parentid= ode.childid) AS VARCHAR(100))
ELSE ml.someotherID
END AS orderid
有没有更好的方法来重写此查询?而不是再次重复select语句(一次为count,然后为value)
答案 0 :(得分:1)
通常,最好将此类逻辑放在from
子句中而不是select
子句中。但是,如果没有其余的查询,很难看出它是否是最好的方法。
对于您的方法,您应该在子查询中使用exists
而不是select count()
:
(CASE WHEN EXISTS (SELECT 1 FROM ode WHERE ode.parentid = ode.childid)
THEN (SELECT CAST(ode.childid as VARCHAR2(100) FROM ode WHERE ode.parentid = ode.childid) )
ELSE ml.someotherID
END) AS orderid
您还可以将其简化为COALESCE()
:
COALESCE( (SELECT CAST(ode.childid as VARCHAR2(100) FROM ode WHERE ode.parentid = ode.childid) ), ml.someotherID)
注意:Oracle更喜欢varchar2()
到varchar()
,因此您应该使用它,除非您有充分的理由不使用它。