【问题标题】:having case block in where clause在 where 子句中有 case 块
【发布时间】:2014-10-11 07:34:48
【问题描述】:

在我的过程中,我试图合并一个 case 块来在 where 子句中执行条件检查。你能帮帮我吗?

下面是我的程序主体,它工作正常..

FROM  TABLE_A
WHERE  name = p_name
AND address = p_address
AND state = p_state
AND ((p_county IS NULL AND default_zone = 'Y') OR (county = p_county)) ;

现在我想拆分最后一段。 我总是会得到一个县列,所以作为标准方式,下面的块将起作用,这是代码中必须有的(这个逻辑)

WHERE name = p_name
AND address = p_address
AND state = p_state
AND county = p_county

现在假设,我们在程序调用期间得到的县不可用,所以在这种情况下,DB 不会返回任何数据,会出现“NO_DATA_FOUND”错误。现在如果出现这个错误,我必须执行下面的块..

WHERE  name = p_name
AND address = p_address
AND state = p_state
AND default_zone = 'Y'

最简单的方法,我应该使用该程序两次并在异常时调用第二个块,但这可能程序非常庞大并且看起来也不好看..有没有一种方法可以用更简单的方式编写..

我正在尝试使用 case 块来获取此代码,但它对我不起作用.. 请建议

【问题讨论】:

  • 您要解决的问题是什么?您的原始代码看起来不错。而且,“案例块”是什么意思? (我只了解 Oracle PL/SQL 方面的概念,但您的标签和代码都不一定暗示 Oracle。)
  • @GordonLinoff 很抱歉造成混淆。我现在已经编辑了我的帖子。请检查并帮助我。
  • 那么,这是 Oracle、SQL Server、PostgreSQL 还是什么?
  • 有人可以建议我一个简单的选项来实现它..

标签: sql stored-procedures procedure


【解决方案1】:

不确定您为什么要重写为 case,但一种解决方案是:

WHERE   CASE 
        WHEN p_county IS NULL AND default_zone = 'Y' THEN county
        ELSE p_county
        END = county

我个人认为您原来的OR 查询更清晰。


回应您的评论:您可以使用dense_rank 将表格拆分为默认和非默认部分。使用order by default_zone,您给予非默认优先级,因为N 在字母表中位于Y 之前。

select  *
from    (
        select  dense_rank() over (
                    order by default_zone) rn
        ,       name
        ,       state
        ,       county
        ,       default_zone
        from    YourTable
        where   county = p_county
                or default_zone = 'Y'
        ) SubQueryAlias
where   rn = 1 -- Pick matching county, or else default

Example at SQL Fiddle.

【讨论】:

  • 抱歉造成混淆。我已经编辑了我的帖子,并提供了更清晰的描述。请检查并建议。
  • 我无法将此代码合并到我的代码中。您能否建议一些其他简单的选项。
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
相关资源
最近更新 更多