2015-08-24 24 views
1

我嘗試從多列(數據類型號)搜索一個數字,但得到ORA-01722: invalid number錯誤。查詢多個列中具有數字數據類型的特定整數值

我的查詢:

SELECT * 
FROM CAMPAIGN 
WHERE 1481125 IN (select column_name 
        from all_tab_columns 
        where table_name = 'CAMPAIGN' 
        AND data_type = 'NUMBER'); 

有什麼不對呢?

+1

'WHERE 1481125 IN(select column_name' problem here。Oracle try'cast'column_name' to number。 –

回答

1

您正在比較您的號碼1481125與每個列的名稱,而不是您表中每列的值。

要從列的名稱(從d​​ba_tab_columns)轉到該列的值,您需要使用某種形式的動態SQL。這裏有一個比較簡單的例子:

DECLARE 
    -- Since I don't have your CAMPAIGN table or data, I'm using DBA_OBJECTS in it's place. 
    l_table_name  VARCHAR2 (30) := 'DBA_OBJECTS'; 
    l_search_number NUMBER := 20;                -- 1481125 in your example 
    l_record   dba_objects%ROWTYPE; 
    l_sql    VARCHAR2 (32000); 
    l_column_number NUMBER := 0; 
    l_cur    SYS_REFCURSOR; 
BEGIN 
    -- First: build dynamic SQL statement of the form: 
    -- SELECT * FROM table_name WHERE 
    -- ((col_name_a = 20) OR (col_name_b = 20) OR ...) 
    l_sql := 'SELECT * FROM dba_objects WHERE ('; 

    FOR r_number_column IN (SELECT column_name 
          FROM dba_tab_columns 
          WHERE table_name = l_table_name 
          AND data_type = 'NUMBER' 
          ORDER BY column_id) LOOP 
    IF l_column_number > 0 THEN 
     l_sql := l_sql || ' OR '; 
    END IF; 

    l_column_number := l_column_number + 1; 
    l_sql    := l_sql || '(' || r_number_column.column_name || ' = ' || l_search_number || ')'; 
    END LOOP; 

    IF l_column_number = 0 THEN 
    -- No number columns in table, so there should be no matches 
    l_sql := l_sql || ' 1=0'; 
    END IF; 

    l_sql := l_sql || ')'; 

    DBMS_OUTPUT.put_line (l_sql); 

    OPEN l_cur FOR l_sql; 

    LOOP 
    FETCH l_cur INTO l_record; 

    EXIT WHEN l_cur%NOTFOUND; 
    DBMS_OUTPUT.put_line ('Object Name ' || l_record.object_name || ' has search number ' || l_search_number); 
    END LOOP; 
END; 
1

您所查詢的是:

SELECT * FROM CAMPAIGN WHERE 1481125 IN 
(select column_name from all_tab_columns where table_name = 'CAMPAIGN' AND data_type='NUMBER') 

打破了下來,我們有:

SELECT * FROM CAMPAIGN WHERE 1481125 IN (<a set of numbers>) 

和子查詢:

select column_name from all_tab_columns 
where table_name = 'CAMPAIGN' 
AND data_type='NUMBER' 

子查詢是否會返回列名的列表例如

CAMPAIGN_COUNT 
CAMPAIGN_ID 
CAMPAIGN_NUMBER_OF_SOMETHINGS 

您的查詢因此等效於:

SELECT * FROM CAMPAIGN WHERE 1481125 IN 
    ('CAMPAIGN_COUNT', 'CAMPAIGN_ID', 'CAMPAIGN_NUMBER_OF_SOMETHINGS') 

你可以看到爲什麼你會得到ORA-01722錯誤呢?

您需要編寫動態SQL才能實現您的目標。

相關問題