Sql where子句中有大小写块

Sql where子句中有大小写块,sql,stored-procedures,procedure,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)) ; 现在我想把最后一段分开。 我总是会得到一个county列,所以作为标准方式,下面

在我的过程中,我试图合并一个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)) ;
现在我想把最后一段分开。 我总是会得到一个county列,所以作为标准方式,下面的块将工作,这是代码中必须具备的(此逻辑)

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

WHERE  name = p_name
AND address = p_address
AND state = p_state
AND default_zone = 'Y'
最简单的方法是,我应该使用这个过程两次,并在异常时调用第二个块,但这个过程可能非常庞大,看起来也不太好。有没有一种方法可以用更简单的方法来编写它


我正在尝试使用case块来获得此代码,但它对我不起作用。。请告知

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

WHERE   CASE 
        WHEN p_county IS NULL AND default_zone = 'Y' THEN county
        ELSE p_county
        END = county
我个人认为你最初的
查询更清晰


回应您的评论:您可以使用
densite\u 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

您试图解决的问题是什么?您的原始代码看起来不错。你所说的“案例块”是什么意思?(我只从Oracle PL/SQL的角度理解这个概念,但您的标记和代码都不一定暗示Oracle。)@GordonLinoff很抱歉混淆了。。我现在已经编辑了我的帖子。请检查并帮助我。那么,这是Oracle、SQL Server、PostgreSQL还是什么?有人能给我建议一个简单的选项来实现它吗?很抱歉,混淆了。。我已经用更清晰的描述编辑了我的帖子。请检查并提供建议。我无法将此代码合并到我的代码中。你能推荐一些其他简单的选择吗。
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