【问题标题】:PL/SQL: Conditional WherePL/SQL:有条件的 Where
【发布时间】:2013-04-23 19:29:16
【问题描述】:

我有以下场景:

CREATE OR REPLACE PROCEDURE GETINBOX
(
    inHasAttachments        IN int
)
AS

BEGIN

    SELECT M.MailId,
           M.SenderId,
           E.Emp_Name As "Sender",
           MI.RecipientId,
           M.Subject

    FROM MAIL M INNER JOIN MAILINBOX MI ON M.MailId = MI.MailId


    WHERE MI.RecipientId = '547' AND
          M.NotificationSelected = 'Y'

    IF inHasAttachments = '1' THEN
       AND M.Attachments = 'Y'
    END IF;


END GETINBOX;

是否可以根据参数的值在where子句中添加条件?

    WHERE MI.RecipientId = '547' AND
          M.NotificationSelected = 'Y'

    IF inHasAttachments = '1' THEN
       AND M.Attachments = 'Y'
    END IF;

显然这是不允许的,但在 PL/SQL 中是否可以通过某种方式做到这一点? 我知道一种方法是复制查询并根据参数的值执行不同的查询,但我不想复制我的代码。

【问题讨论】:

  • 如果 where 子句是唯一的区别,那为什么不UNION ALL
  • 在这种情况下为什么要使用 UNION ALL?
  • 啊对不起,我误解了参数使用的部分......

标签: asp.net oracle plsql conditional where


【解决方案1】:

据我了解您的要求:如果参数inHasAttachments 的值是1,那么您想通过M.Attachments = 'Y' 进一步过滤,如果它的值不是1,那么您不关心@ 987654325@。这是条件MI.RecipientId = '547' AND M.NotificationSelected = 'Y'的补充。

你可以这样做:

SELECT M.MailId,
   M.SenderId,
   E.Emp_Name As "Sender",
   MI.RecipientId,
   M.Subject
FROM MAIL M INNER JOIN MAILINBOX MI ON M.MailId = MI.MailId
WHERE MI.RecipientId = '547' AND M.NotificationSelected = 'Y'
  AND (inHasAttachments <> '1' OR M.Attachments = 'Y')

【讨论】:

  • 这是一个有趣的解决方案,但我忘记提及的一件事是,我还想根据某些条件添加另一个“INNER JOIN”语句:IF (PARAMETER_VALUE = 'Y') THEN INNER JOIN MAILATTACHMENTS MA ON MA.MailId = M.MailId,这可能吗?
  • 您加入只是为了过滤掉更多行(那些不在MailAttachments 中的行),还是加入是因为您想从MailAttachments 中选择列?如果它是第一个那么它可能是可行的,但它会开始看起来越来越像一个黑客。如果是第二个(甚至可能是第一个),那么您可能需要将查询构建为字符串并使用 PL/SQL 的 EXECUTE IMMEDIATE
  • 谢谢 Ed Gibbs,将查询构建为字符串,然后使用 EXECUTE IMMEDIATE 是个好主意,考虑到我的条件太多,它符合我的需求。
  • 好电话-我刚刚尝试了类似于我上面的答案的INNER JOIN,但它变得混乱-非常混乱:)
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 2014-05-19
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 2018-02-09
相关资源
最近更新 更多