我有一个简单的查询,我想要过滤用户提供的值的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列名称并形成查询。这有效,但是这非常麻烦且不干净。有没有更好的方法呢?
答案 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”列。
如果列名可以更改,或者列是动态添加/删除的,那么这将无效。