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