Oracle动态查询

时间:2011-09-21 16:23:20

标签: sql oracle

我有一个简单的查询,我想要过滤用户提供的值的vanilla select语句。

SELECT A,B,C,D,E FROM TAB
WHERE ....

这里WHERE没有固定,即用户可以输入C的值,因此只应过滤C,或者D或E等。问题是由于用户告知 - 过滤掉1到10之间的callerID等,但数据库列具有不同的名称。因此,要形成一个工作查询,我必须将callerID映射到columnName。因为这将是一个过程,我想过传递userInputColumnNames的csv,dbColumns的csv和过滤器开始和开始。然后费力地提取值并匹配正确的db列名称并形成查询。这有效,但是这非常麻烦且不干净。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

表格中的列名是否会发生变化? 或者是否添加/删除了表格中的列? 如果没有,您可以生成一个数字以映射到表中的每一列,如:

SQL> SELECT column_name, ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY column_name) "COLUMN_NUMBER"
  2  FROM dba_tab_columns
  3  WHERE table_name='DBA_USERS'
  4  
baim> /

COLUMN_NAME                    COLUMN_NUMBER
------------------------------ -------------
ACCOUNT_STATUS                             1
CREATED                                    2
DEFAULT_TABLESPACE                         3
EXPIRY_DATE                                4
EXTERNAL_NAME                              5
INITIAL_RSRC_CONSUMER_GROUP                6
LOCK_DATE                                  7
PASSWORD                                   8
PROFILE                                    9
TEMPORARY_TABLESPACE                      10
USERNAME                                  11
USER_ID                                   12

12 rows selected.

然后,当用户选择第9列时,您知道它映射到“PROFILE”列。

如果列名可以更改,或者列是动态添加/删除的,那么这将无效。