在查询中选择逻辑。这可能在Oracle中实现吗?

时间:2013-03-27 13:53:02

标签: sql oracle oracle11g

我试图在查询的select语句上实现某种逻辑。我想要它,如果没有给出属性,或者inAttribute是'NONE';它将返回日期和所有值(compprice,compspread,price,spread,run)。

如果在属性中给出了一个值,那么我希望它返回它请求的值(参考我试图做的case语句)。

以下是我的尝试,它只是不起作用。有什么帮助吗?

 SELECT 
    mi.date,
    IF inAttribute = '' THEN

              mi.compprice, 
              mi.compspread, 
              mi.price, 
              mi.spread, 
              mi.run
              ELSE
                 CASE inAttribute
                      WHEN 'CP' THEN  mi.compprice, 
                      WHEN 'CS THEN mi.compspread, 
                      WHEN 'MP' THEN  mi.price, 
                      WHEN 'MS' THEN mi.spread, 
                      WHEN 'R' THEN mi.run
                 END 
    END IF
    FROM userValueTable mi
    WHERE mi.index_family = inIdxFamily
    AND mi.index_id = inIdxId
    AND mi.date_>= inStartDate
    AND mi.date_<= inEndDate
    ORDER by mi.date_ ASC;

3 个答案:

答案 0 :(得分:2)

几点评论

  • 您不能将变量列列表从一行添加到另一行。
  • ''等于NULL,将NULL与等式(=)进行比较始终为false。
  • 您可以使用CASE子句拥有一些固定数量的列并设置任何列的值。

  • 答案 1 :(得分:0)

    Oracle SQL中没有IF,仅在PL / SQL中。你必须将它重写为CASE。与您在ELSE部分中的查询中所做的相同(在'CS'之后,您错过了一个结束引用...)。

    SELECT ...
     (CASE WHEN inAttribute IS NULL THEN mi.compprice
         WHEN .... THEN...
         WHEN .... THEN...
         ...
     ELSE ...
     END) AS some_column_alias
    FROM ...
    

    答案 2 :(得分:0)

    Oracle没有SQL IF。请改用CASE - 它可以像您在查询中一样使用C / C#/ Java / etc switch - case,它也可以像if一样。

    另外,如上所述:

    • 除非使用动态SQL
    • ,否则您将无法返回固定数量的列
    • 在Oracle中,''被视为NULL,而不是= ''使用IS NULL

    如果您不想转到动态SQL,可以在选择列表中添加“类型”列,然后将任何不适用的值清空。您的下游逻辑可以根据类型选择要使用(或忽略)的值。这是一个例子:

    SELECT
      mi.date,
      CASE
        WHEN inAttribute IS NULL THEN 'inAttrNull'
        ELSE 'inAttrNotNull'
        END AS RecordType,
      CASE WHEN inAttribute IS NULL THEN mi.compprice END AS compprice,
      CASE WHEN inAttribute IS NULL THEN mi.compspread END AS compspread,
      CASE WHEN inAttribute IS NULL THEN mi.price END AS price,
      CASE WHEN inAttribute IS NULL THEN mi.spread END AS spread,
      CASE WHEN inAttribute IS NULL THEN mi.run END AS run,
      CASE inAttribute
        WHEN 'CP' THEN mi.compprice
        WHEN 'CS' THEN mi.compspread
        WHEN 'MP' THEN mi.price
        WHEN 'MS' THEN mi.spread
        WHEN 'R'  THEN mi.run
      END AS SpecialValue
    FROM userValueTable mi
    ... and your WHERE and ORDER BY clauses
    

    你会得到一个像这样的结果集:

    RecordType    compprice  compspread price      spread     run        specialvalue
    ------------- ---------- ---------- ---------- ---------- ---------- ------------
    inAttrNotNull     (null)      (null)    (null)     (null)     (null)      1234.56
    inAttrNull        111.11      222.22    333.33     444.44     555.55       (null)
    

    我知道这不是你想要的,但它可能是你可以作为替代品使用的东西。