Oracle Sql CASE语句根据行计数返回数据

时间:2015-12-15 12:43:42

标签: sql oracle

我想在查询中选择一个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)

1 个答案:

答案 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(),因此您应该使用它,除非您有充分的理由不使用它。