0

私のテーブル構造は..

A_TEXT(ID number,name varchar2)
POLICY_INFO (PI_ID number,relation_id varchar2)

このようなクエリがあります。

SELECT * FROM A_TEXT A  WHERE   a.name  = 'test' OR  a.ID IN 
            (SELECT  TO_NUMBER(RELATION_ID )
             FROM POLICY_INFO 
             )  

クエリを実行しようとすると、無効な番号の例外が発生しました。クエリを少し変更した場合 Like :

SELECT * FROM A_TEXT A  WHERE a.name  = 'test' OR  TO_CHAR(a.ID) IN 
           (SELECT  RELATION_ID
             FROM POLICY_INFO 
             )  

それはうまく実行されます。

4

2 に答える 2

1

考えられる理由は、列RELATION_IDに数字以外の文字が含まれていることです(Anything apart from 0-9, NULL)

すべてNUMBERの は に変換できますがVARCHAR、その逆はできないことに注意してください。

列 RELATION_ID を確認するには、以下の関数を使用して、数値以外の文字列を検証します。

CREATE OR REPLACE FUNCTION isnumeric(p_string in varchar2)
RETURN BOOLEAN
AS
    l_number number;
BEGIN
    l_number := p_string;
    RETURN TRUE;
EXCEPTION
    WHEN OTHERS THEN
        RETURN FALSE;
END;
/

ファローアップ:

WITH POLICY_INFO
    AS (SELECT
             1 AS PI_ID,
             '1' AS RELATION_ID
        FROM
             DUAL),
    A_TEXT
    AS (SELECT
             1 AS ID,
             'testA' AS NAME
        FROM
             DUAL
        UNION ALL
        SELECT
             2 AS ID,
             'test' AS NAME
        FROM
             DUAL)
SELECT
      *
FROM
      A_TEXT A
WHERE
      A.NAME = 'test'
      OR A.ID IN (SELECT TO_NUMBER ( RELATION_ID ) FROM POLICY_INFO);

これはうまくいきます。これを確認してください。それでも問題が解決しない場合は、完全なデータセットをお知らせください

于 2013-09-26T08:57:43.667 に答える