0

こんなお問い合わせが・・・

SELECT 1,2,3 
FROM (SELECT CASE WHEN something THEN TO_CHAR(1)... END,2,3 
      FROM tables WHERE condtions) 
      WHERE 1 NOT LIKE 'String'

すべての列は varchar2 です。このクエリで Invalid Number エラーが発生し、内側の case ステートメントを指しています。内側のクエリは個別に正常に実行されます。外側の WHERE 条件を削除すると、クエリ全体が正常に実行されます。

これは SQL オプティマイザーで何かをしなければならないことは理解していますが、ここで何が間違っていて、どうすればこれを回避できますか? 文字列または外部選択ステートメントに To_CHAR を使用しても機能しません...


理解を深めるための更新、

SELECT COL1, COL2, COL3 FROM (
SELECT CASE WHEN LOGIC THEN TO_CHAR(1) ELSE TO_CHAR(0) END AS COL1, 
COUNT(SOME_COL) AS  COL2 , COUNT(SOME_COL2) AS COL3 FROM TABLES WHERE CONDTIONS
) WHERE COL1 NOT LIKE ‘0’

Oracle SQL オプティマイザーが干渉して上記のエラーを引き起こしているため、クエリを別の方法で作成する必要があると言われました。

4

2 に答える 2

0

適切な列名 (文字で始まる) を使用する必要があります - 1,2,3 は機能しません (引用されていない限り):

create table tab1 as 
select 1 as pk from dual
union all
select 2 as pk from dual
union all
select 3 as pk from dual;

SELECT col1,col2,col3 
FROM (SELECT (CASE WHEN 1=2 THEN TO_CHAR(1) else to_char(2) END) as col1 ,
      2 as col2,
      3 as col3
      FROM tab1 WHERE pk > 1) 
      WHERE col1 NOT LIKE '%1%'
于 2013-03-27T11:24:01.327 に答える
0

後ろの目盛りで囲むことにより、1 が列名であることを示します。

SELECT 1,2,3 FROM (SELECT CASE WHEN something THEN TO_CHAR(1)... END,2,3 
FROM tables
WHERE condtions) WHERE `1` NOT LIKE 'String'
于 2013-03-27T08:46:05.307 に答える