从具有数字数据类型的多个列查询特定整数值

时间:2015-08-24 14:41:24

标签: sql oracle ora-01722

我尝试从多个列(数据类型编号)中搜索一个数字,但得到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 个答案:

答案 0 :(得分: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;