2011-09-21 115 views
0

我有一个简单的查询,我想要筛选用户提供的值的香草选择语句。Oracle动态查询

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

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

+0

你可以在应用程序端处理这个问题吗? – NullUserException

回答

1

表中的列名是否改变? 或者是表中的列添加/删除? 如果没有,你可以生成一个数字映射到每个列在表所示:然后,当用户选择列9

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. 

,你知道它映射到“档案”栏目。

如果列名可以更改,或者动态添加/删除列,那么这将不起作用。