1

クエリの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;
4

3 に答える 3

2

いくつかの発言

  • ある行から別の行に可変列リストを作成することはできません。
  • ''はNULLに等しく、NULLを等式(=)と比較することは常にfalseです。
  • CASE句を使用して、列の数を固定し、任意の列の値を設定できます。

  • 于 2013-03-27T14:06:25.457 に答える
    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 ...
    
    于 2013-03-27T14:06:06.940 に答える
    0

    OracleにはforSQLがありませんIF。代わりに使用してください-クエリにあるCASEようにC/C#/ Java / etcのように機能し、。のように機能することもできます。switch - caseif

    また、上記のように:

    • 動的SQLを使用しない限り、一定数の列を返すことに固執します
    • Oracleでは、を使用する''代わりにNULLとして扱われます。= ''IS NULL

    動的SQLに移動したくない場合は、選択リストに「タイプ」列を追加してから、適用できない値をnullにすることができます。ダウンストリームロジックは、タイプに基づいて使用する(または無視する)値を選択できます。次に例を示します。

    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 に答える