在where子句中有case块

时间:2014-08-18 11:39:32

标签: sql stored-procedures procedure

在我的程序中我试图合并一个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块来获取此代码,但它不适用于我..请参阅建议

1 个答案:

答案 0 :(得分:3)

不确定您为什么要重写为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.