代码之家  ›  专栏  ›  技术社区  ›  Eric

SQL查询中的if语句

  •  1
  • Eric  · 技术社区  · 15 年前

    早上好。我有疑问。我只想在另一个字段是某个thingle时在查询中选择某个内容。下面的查询将更好地解释

    select  
    Case isnull(rl.reason,'Not Found')
      When 'D' then 'Discontinued'
      When 'N' then 'Not Found'
      When 'I' then 'Inactive'
      When 'C' then 'No Cost'
      When '' then 'Not Found'
    End as Reason, ***If statement to select pv.descriptor only if reason is in ('D','I','C')***pv.descriptor
    from table1 as rl
    left join  table2 as v on v.field= rl.field
    
    
    ***Here i want an if statment to run if reason is in ('D','I','C')***
    left join table3 as pv on 
    Case rl.scantype
     when 'S' then cast(ltrim(rtrim(pv.field#1)) as varchar)
     when 'U' then cast(ltrim(rtrim(pv.field#2)) as varchar)
     when 'V' then cast(ltrim(rtrim(pv.vfield#3)) as varchar)
    end
    = rl.scan and pv.vend_no = rl.vendnum
    ***'**If statement ends*****
    
     left join storemain..prmastp as p on p.emuserid = rl.userid
     where rl.scandate between GetDate() -7 and GetDate() order by rl.scandate desc
    

    我希望if语句仅在选择的原因是“d”、“i”或“c”时选择描述符。如果不是,我希望在这里有一个空值,因为除非原因是“d”、“i”、“c”,否则我不会执行联接来获取该变量。

    顺便说一下,我可以在左连接的中间使用case语句。它工作得很好。这不是我的问题。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Mark Brackett    15 年前

    认为 你只想加入 pv 如果 v.reason (D, I, C) -是吗?如果这是你的问题,只要改变你的 JOIN 条款:

    LEFT JOIN table3 as pv ON 
       LTRIM(RTRIM(
           CASE rl.scantype
              WHEN 'S' THEN pv.field#1
              WHEN 'U' THEN pv.field#2
              WHEN 'V' THEN pv.field#3
           END
       )) = rl.scan 
       AND rl.vendnum = pv.vend_no
       AND rl.reason IN ('D', 'I', 'C')
    

    当然,在select子句中也有“if语句,仅当reason在('d'、'i'、'c')[as]pv.descriptor]中时才选择pv.descriptor”。所以,假设你想要 那个 相反,请尝试以下操作:

    SELECT
       /* your other columns */
       CASE 
          WHEN rl.reason IN ('D', 'I', 'C') THEN pv.descriptor
          ELSE NULL --optional, since it'll default to NULL
       END as descriptor
    
        2
  •  2
  •   MattH    15 年前

    如果您想在一个查询中使用它,就必须进行连接。使用左边的连接和case语句,可以确保pv.descriptor在某些情况下显示为空。

    如果需要控制流,则需要使用T-SQL

    如果您关心性能问题,则不应使用计算值进行连接。重新考虑数据库设计。您可能希望为联接创建新的列,并且如果您有多对多关系,可能希望创建中间表。

        3
  •  0
  •   Amy B    15 年前

    是什么激发了两个查询的组合?加入可能会导致需要一个完全不同的评估计划…根据变量值(或更糟的列)在两个计划之间进行选择!查询优化器做得不好。

    如果编写两个查询并使用一个SQL if语句将控制流传递给其中一个查询,那么情况会好得多。

    编辑:如果RL中有两行,一行的原因=D,一行的原因=S,查询应该返回什么?

        4
  •  0
  •   Beth    15 年前

    我会保持简单,以便将来支持您的代码的人能够了解如何维护它(例如,当他们添加另一个原因代码时)。

    它可能没有性能好,但更易于维护。

    另外,有没有一种方法可以在表中获取这些代码并测试标记,而不是在SQL中硬编码它们?