2

これは機能します:

 SELECT (CASE
             WHEN x = 'value' THEN
              a.col1
             ELSE
              nvl(a.col1, a.col2)
           END)
      FROM table1 a
     WHERE a.this = 'that'
     GROUP BY (CASE
                WHEN x = 'value'  THEN
                 a.col1
                ELSE
                 nvl(a.col1, a.col2)
              END)

しかし、caseステートメントにINステートメントを実行させようとすると(ここではより動的なSQLを試行します)、次のコードはORA-00979エラーになります。

SELECT (CASE
         WHEN x IN (SELECT me FROM here WHERE this = 'example') THEN
          a.col1
         ELSE
          nvl(a.col1, a.col2)
       END)
  FROM table1 a
 WHERE a.this = 'that'
 GROUP BY (CASE
            WHEN x IN (SELECT me FROM here WHERE this = 'example') THEN
             a.col1
            ELSE
             nvl(a.col1, a.col2)
          END)

これを機能させることは可能ですか、それとも代替手段を用意することは可能ですか?ありがとう。-ジョナス

Benoit:エラーを再現するSQLに基づいて変更されたSQLは次のとおりです。

select (case when a.y IN (select 'A'||ROWNUM from dual where rownum=1) then 1 else 0 end)
from (SELECT 'A'||ROWNUM y, 'B' x FROM DUAL CONNECT BY ROWNUM <= 3) a where x = 'B'
group by (case when a.y IN (select 'A'||ROWNUM from dual where rownum=1) then 1 else 0 end)
;

基本的に欠落していたのは、FROMテーブルに複数の値が必要であり、CASEステートメントで列が参照されていることでした。

4

2 に答える 2

2

次のリクエストでこのエラーを再現できません(動作中):

select (case when 'X' IN (select dummy from dual where rownum=1) then 1 else 0 end)
from dual
where dummy = 'X'
group by (case when 'X' IN (select dummy from dual where rownum=1) then 1 else 0 end)
;

試す:

WITH table1_extended AS (
   SELECT a.*, CASE WHEN x IN .... END "condition"
     FROM table1 a
)
SELECT b."condition"
  FROM table1_extended b
 WHERE b.this = 'that'
 GROUP BY b."condition"
于 2010-09-29T07:59:50.860 に答える
1

副選択を結合に移動できない理由はありますか? @Benoit のテスト ケースの調整済みバージョンから、次のことができます。

select case when a.y = b.z then 1 else 0 end, count(*)
from (select 'A'||rownum y, 'B' x from dual connect by rownum <= 3) a,
    (select 'A'||rownum z from dual where rownum=1) b
where a.x = 'B'
group by case when a.y = b.z then 1 else 0 end;

これは(10gで):

CASEWHENA.Y=B.ZTHEN1ELSE0END COUNT(*)               
---------------------------- ---------------------- 
1                            1                      
0                            2

あなたが望む答えが得られると完全に確信しているわけではありませんが、非常に単純化されており、出発点になる可能性があるため、わかりにくい.


編集これは確かに単純すぎるようです。単純すぎるように見えますが、トリックを行う可能性のある別の可能な解決策は、反対側からこれにアプローチし、集計関数で を作成することcaseですselect

SELECT MIN(CASE
         WHEN x IN (SELECT me FROM here WHERE this = 'example') THEN
          a.col1
         ELSE
          nvl(a.col1, a.col2)
       END)
  FROM table1 a
 WHERE a.this = 'that'
 GROUP BY (CASE
            WHEN x IN (SELECT me FROM here WHERE this = 'example') THEN
             a.col1
            ELSE
             nvl(a.col1, a.col2)
          END)
于 2010-09-29T09:18:14.137 に答える