2011-09-21 72 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. 

,你知道它映射到「檔案」欄目。

如果列名可以更改,或者動態添加/刪除列,那麼這將不起作用。