0

IN 句でカンマ区切りの文字列を返すサブクエリを使用しようとしています。

次の方法:

SELECT p.person_id, g.name || '>>' || p.firstname || ' ' || p.lastname as GROUP_PATH
FROM PERSON p 
LEFT JOIN GROUP g ON (
    g.group_id = p.group_id
)
WHERE p.person_id IN ( 
    SELECT person_ids FROM other WHERE other_id = :OTHER_ID
) 
ORDER BY lower(GROUP_PATH) 

そして、次のエラーが表示されます。

ORA-01722: 番号が無効です。

これを行うためのより良い方法はありますか、それとも可能ですか?

4

2 に答える 2

4

最も明白な説明は、文字列で数学を実行しようとしているということです...

文字列が有効な数値リテラルではないため、文字列を数値に変換しようとして失敗しました。算術関数または式で使用できるのは、数値フィールドまたは数値データを含む文字フィールドのみです。日付に加算または日付から減算できるのは、数値フィールドのみです。

http://ora-01722.ora-code.com/

更新 #1:

あなたの説明は私を心配しています:

IN 句でカンマ区切りの文字列を返すサブクエリを使用しようとしています。

サブクエリは、コンマ区切りの文字列を返すべきではありませんg.group_id( が文字列であり、コンマ区切りの文字列が必要な場合を除く)。必要な数の行で個々の項目を取得する必要があります (とにかく 1,000 未満)。

更新 #2:

明確にするために:

SELECT *
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO;

FOO_ID                 
---------------------- 
1                      
2                      
3  

あなたはこれを行うことができます:

SELECT *
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO
WHERE FOO_ID IN (1, 2);

FOO_ID                 
---------------------- 
1                      
2 

しかし、これではありません:

SELECT *
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO
WHERE FOO_ID IN ('1,2');

SQL Error: ORA-01722: invalid number

1numberと string を比較できないためです'1,2'。サブクエリは同様の規則に従います。

SELECT *
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO
WHERE FOO_ID IN (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL
);

FOO_ID                 
---------------------- 
1                      
2 

SELECT *
FROM (
    SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO
WHERE FOO_ID IN (
    SELECT '1,2' AS FOO_ID FROM DUAL
);

SQL Error: ORA-01722: invalid number
于 2011-01-19T16:04:09.553 に答える
2

エイリアスを参照するには、少なくとも、GROUP_PATHORDER BY 句でエイリアスを参照する前に、エイリアスが定義されているネストされたサブクエリを使用する必要があります。それは現実的にORA-01722エラーを引き起こしていませんが、問題です

SELECT group_id, group_path
  FROM (SELECT g.group_id, 
               g.name || '>>' || p.firstname || ' ' || p.lastname as GROUP_PATH
          FROM PERSON p 
               LEFT JOIN GROUP g ON (
                      g.group_id = p.group_id
               )
         WHERE p.person_id IN ( 
               SELECT person_ids FROM other WHERE other_id = :OTHER_ID
               ) 
 ORDER BY lower(GROUP_PATH) 

表のPERSON_IDS列がOTHERコンマ区切りの値のリストである場合、IN リストは期待どおりに機能しません。スカラー文字列 (たまたまコンマが含まれている) を、複数の PERSON_ID 値のコレクションのようなものに変換する必要があります。これを行うにはさまざまなアプローチがあります。Tom Kyte は変数 IN listを使用する 1 つの例を持っています。Tom の IN_LIST 関数をコピーすると仮定すると、次のようなことができるはずです。

SELECT group_id, group_path
  FROM (SELECT g.group_id, 
               g.name || '>>' || p.firstname || ' ' || p.lastname as GROUP_PATH
          FROM PERSON p 
               LEFT JOIN GROUP g ON (
                      g.group_id = p.group_id
               )
         WHERE p.person_id IN ( 
               SELECT column_value
                 FROM TABLE(SELECT in_list(person_ids) 
                              FROM other 
                             WHERE other_id = :OTHER_ID)
               ) 
 ORDER BY lower(GROUP_PATH) 
于 2011-01-19T16:13:29.090 に答える