1

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

如果在属性中给出了一个值,那么我希望它返回它请求的值(请参阅我尝试做的案例声明)。

下面是我的尝试,它只是不工作。请问有什么帮助吗?

 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;
4

3 回答 3

2

几句话

  • 您不能有从一行到另一行的可变列列表。
  • '' 等于 NULL,将 NULL 与相等 ( = ) 进行比较总是错误的。
  • 您可以使用 CASE 子句拥有一些固定数量的列并设置任何列的值。

  • 于 2013-03-27T14:06:25.457 回答
    0

    Oracle SQL 中没有 IF,只有 PL/SQL 中。您必须将其重写为 CASE。与您在 ELSE 部分的查询中所做的相同(您在 'CS' THEN ... 之后错过了一个单引号)。

    SELECT ...
     (CASE WHEN inAttribute IS NULL THEN mi.compprice
         WHEN .... THEN...
         WHEN .... THEN...
         ...
     ELSE ...
     END) AS some_column_alias
    FROM ...
    
    于 2013-03-27T14:06:06.940 回答
    0

    Oracle 没有IFfor SQL。改为使用CASE- 它可以像switch - case您在查询中使用的 C/C#/Java/etc 一样,它也可以像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)
    

    我知道这不是您想要的,但它可能是您可以使用的替代方案。

    于 2013-03-27T14:38:56.600 回答