绑定变量的案例语句用法
Posted
技术标签:
【中文标题】绑定变量的案例语句用法【英文标题】:Case Statement Usage With Bind Variables 【发布时间】:2014-07-09 08:55:58 【问题描述】:我在purchases
表中有一个名为purchase_order_status
的列,其中包含Open
和Closed
作为值。
SELECT *
FROM purchases
WHERE purchase_order_status = :status
如果用户将All
作为绑定参数传递,我如何获取具有Open
和Closed
状态的所有行,如下使用case 语句?
in ('Open','Closed')
是否可以在case语句中使用绑定变量,比如
case when :status = 'All' then 'Open','Closed'
【问题讨论】:
我可能错了,但是如果所有记录都匹配,为什么还要使用条件呢? 只能在select子句中使用CASE @Bartdude 是个好问题,用户可以通过 All,Open 或 Closed,所以如果是 All,那么我必须使用 Open 和 Closed。 【参考方案1】:您可以使用case
,但只使用普通逻辑运算符会更容易、更清晰:
SELECT *
FROM purchases
WHERE ((:status = 'All' AND purchase_order_status IN ('Open','Closed'))
OR purchase_order_status = :status)
使用一些简单的示例数据和一个 SQL*Plus 绑定变量:
create table purchases (purchase_order_status varchar2(10));
insert into purchases values ('Open');
insert into purchases values ('Closed');
insert into purchases values ('Pending');
var status varchar2(10);
通过“打开”:
exec :status := 'Open';
anonymous block completed
SELECT *
FROM purchases
WHERE ((:status = 'All' AND purchase_order_status IN ('Open','Closed'))
OR purchase_order_status = :status);
PURCHASE_ORDER_STATUS
---------------------
Open
并传递 'All:
exec :status := 'All';
anonymous block completed
SELECT *
FROM purchases
WHERE ((:status = 'All' AND purchase_order_status IN ('Open','Closed'))
OR purchase_order_status = :status);
PURCHASE_ORDER_STATUS
---------------------
Open
Closed
如果您可以保证该列可以仅保存这两个值,那么您可以将其进一步简化为:
SELECT *
FROM purchases
WHERE :status = 'All' OR purchase_order_status = :status;
【讨论】:
Alex +1,这就是我要找的。非常感谢。【参考方案2】:亚历克斯的答案是更好的 IMO,但这里有一个替代方案。
declare @test as varchar(10)
set @test = 'ALL'
if(@test='ALL') begin
select * from purchases where purchase_order_status in('Open','Closed')
end
if(@test='OPEN') begin
select * from purchases where purchase_order_status in('Open')
end
我个人会在生成选择查询的代码中做这种事情(如果有这样的代码)
【讨论】:
戴夫,我正在使用 Oracle。 @Polppan - 单独的查询可能仍然会使解析器更清晰,也可能更简单,但这可能不是您的选择。以上是关于绑定变量的案例语句用法的主要内容,如果未能解决你的问题,请参考以下文章