Asp.net PL/SQL:条件式,其中

Asp.net PL/SQL:条件式,其中,asp.net,oracle,plsql,conditional,where,Asp.net,Oracle,Plsql,Conditional,Where,我有以下情况: 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

我有以下情况:

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中是否可以以某种方式实现这一点?
我知道一种方法是复制查询并根据参数的值执行不同的查询,但我不想复制我的代码。

据我所知,您的要求是:如果hasaAttachments中的参数
的值是
1
,那么您希望通过
M.Attachments='Y'
进行进一步筛选,如果它的值不是
1
,那么您就不关心
M.Attachments
。这是对条件
MI.RecipientId='547'和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')
选择M.MailId,
森德里德先生,
E.Emp_名称为“发送方”,
MI.RecipientId,
M.主题
从邮件M内部加入M.MailId=MI.MailId上的邮件收件箱MI
其中MI.RecipientId='547'和M.NotificationSelected='Y'
和(在附件'1'或M.附件='Y'中)

我理解您的要求:如果hasaAttachments
中的参数
的值是
1
,那么您希望通过
M.Attachments='Y'
进一步过滤,如果其值不是
1
,那么您就不关心
M.Attachments
。这是对条件
MI.RecipientId='547'和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')
选择M.MailId,
森德里德先生,
E.Emp_名称为“发送方”,
MI.RecipientId,
M.主题
从邮件M内部加入M.MailId=MI.MailId上的邮件收件箱MI
其中MI.RecipientId='547'和M.NotificationSelected='Y'
和(在附件'1'或M.附件='Y'中)

如果where子句是唯一的区别,那么为什么不
UNION ALL
在这种情况下,为什么您指的是UNION ALL?啊,对不起,我误解了参数使用的部分…如果where子句是唯一的区别,那么为什么不
UNION ALL
为什么在这个场景中你指的是UNION ALL呢?啊,很抱歉,我误解了参数使用的部分……这是一个有趣的解决方案,但是我忘记提到的一件事是,我还想根据一些条件添加另一个“internal JOIN”语句:IF(parameter_VALUE='Y')然后,内部加入MAILATTACHMENTS MA ON MA.MailId=M.MailId,这是可能的吗?你加入只是为了过滤掉更多的行(那些不在
MAILATTACHMENTS
中的行),还是因为你想从
MAILATTACHMENTS
中选择列?如果它是第一个,那么它可能是可行的,但它将开始看起来越来越像一个黑客。如果是第二个(甚至可能是第一个),那么您可能需要考虑将查询构建为字符串并使用PL/SQL的
EXECUTE IMMEDIATE
。谢谢Ed Gibbs,将查询构建为字符串然后使用EXECUTE IMMEDIATE是一个好主意,考虑到我有太多的条件,它符合我的需要。很好的调用-我刚刚尝试了类似于我的答案的
内部连接
,结果变得很混乱-非常混乱:)这是一个有趣的解决方案,但我忘了提到的一点是,我还想根据某些条件添加另一个“内部连接”语句:IF(参数_值='Y')然后内部加入MAILATTACHMENTS MA ON MA.MailId=M.MailId,这可能吗?加入只是为了过滤掉更多行(那些不在
MAILATTACHMENTS
中的行),或者你加入是因为你想从
邮件附件
中选择列?如果是第一个,那么它可能是可行的,但它看起来越来越像黑客。如果是第二个(甚至可能是第一个)然后,您可能需要考虑将查询构建为字符串,并使用PL/SQL的
执行立即数
。谢谢Ed Gibbs,将查询构建为字符串,然后使用执行立即数是一个好主意,考虑到我有太多的条件,它适合我的需要。这是一个很好的选择-我刚刚尝试了一些类似于我的答案的东西,带有
内部JOIN
它变得凌乱-非常凌乱:)