绑定变量的案例语句用法

Posted

技术标签:

【中文标题】绑定变量的案例语句用法【英文标题】:Case Statement Usage With Bind Variables 【发布时间】:2014-07-09 08:55:58 【问题描述】:

我在purchases 表中有一个名为purchase_order_status 的列,其中包含OpenClosed 作为值。

SELECT *
  FROM purchases
 WHERE purchase_order_status = :status

如果用户将All 作为绑定参数传递,我如何获取具有OpenClosed 状态的所有行,如下使用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 - 单独的查询可能仍然会使解析器更清晰,也可能更简单,但这可能不是您的选择。

以上是关于绑定变量的案例语句用法的主要内容,如果未能解决你的问题,请参考以下文章

Perl DBI:带有 OR 语句的奇数绑定变量(需要 y 时使用 x 绑定变量调用)

超多绑定变量导致异常的一个案例

在 MonetDB 中的 case 语句中绑定变量

在 SQL 语句中外连接绑定变量 (Oracle 11g)

预编译sql语句就sql绑定变量吗

MySQL高级特性——绑定变量