2016-11-02 5 views
2

は、私は私のSQLクエリに問題があり、それを解決する方法を知らない:のOracle SQL - CASE THEN ELSE ELSE部分を無視して

出力テーブルが構成されています。

1. SERIALNR VARCHAR(26) NOT NULL 
2. LP_BASIC VARCHAR(20) NOT NULL 
3. LP_NEW  VARCHAR(20) 
4. SCORE  NUMBER(20) NOT NULL 
5. CURRENT_LP VARCHAR(20) 

クエリ自体は正常に動作し、エラーはありません。

LP_NEWはオプションのフィールドであるのに対しLP_BASICカラムは常に満たされています。 CURRENT_LPは常にを表示する必要があります。LP_NEW(空でない場合)else LP_BASIC(これは決して空ではありません)。

"ELSE f.LP_BASIC" -Partが機能しないという問題があります。 LP_BASIC値を返す必要があります。レコードが見つからない場合は、LP_NEWレコードが見つかりますが、空のフィールドのみが返されます。

SELECT 
    f.SERIALNR, 
    f.LP_BASIC, 
    f.LP_NEW, 
    f.SCORE, 
    CASE 
    WHEN 
     f.LP_NEW 
     IS NOT NULL 
     THEN 
      f.LP_NEW 
    ELSE 
     f.LP_BASIC 
    END 
AS CURRENT_LP 
FROM (
     SELECT 
      SERIALNR, 
      MAX(SCORE) MAX_ID 
     FROM 
      EAPS.PS_TC_SM 
     GROUP BY 
      SERIALNR 
    ) x 
INNER JOIN 
    EAPS.PS_TC_SM f 
ON 
    f.SERIALNR= 
    x.SERIALNR 
AND 
    f.SCORE = 
    x.MAX_ID 

助けが必要です。

ありがとうございます。

Rob。

UPDATE(解決)

LP_NEW列が単一の空白文字は、それにあった、nullではなかったので、 "NULL IS" は動作しませんでした。

+0

いくつかのサンプルデータを、必要な結果とあなたのクエリ – Aleksej

+0

からなっているものは、これは読みはるかに簡単ではないでしょうを投稿してください? 'coalesce(f.LP_NEW、f.LP_BASIC)' – Kritner

+1

@Kritner 'Coalesce'が優れています。 'Nvl'は両方の値を比較し、値が見つかるとすぐに'合体 'が止まります。 – JohnHC

答えて

2

(これはコメントのために長すぎたので答えとして掲載)

、あなたのCASE文は完全に罰金です。入力データを再確認する必要があります。偽のデータを使用してのアプローチの正しさを証明する

例:

with v_input(serialnr, lp_basic, lp_new) as (
    select 
    level, 
    'basic_' || to_char(level), 
    (case when mod(level, 2) = 0 then 'new_' || to_char(level) else null end) 
    from dual 
    connect by level <= 10) 
SELECT 
    f.SERIALNR, 
    f.LP_BASIC, 
    f.LP_NEW, 
    CASE 
    WHEN 
     f.LP_NEW 
     IS NOT NULL 
     THEN 
      f.LP_NEW 
    ELSE 
     f.LP_BASIC 
    END 
AS CURRENT_LP 
FROM v_input f 
+0

ありがとうございます。すべてのLP_NEWレコードにCASE文が動作しないようにスペース文字が1つあったので、IS NULLを= ''に変更したところ、すべてが期待通りに機能しました。私はSQLに新しいことがあり、これについては考えられませんでした。 – Robama