Sql Oracle动态查询
我有一个简单的查询,普通的select语句,我想过滤用户提供的值Sql Oracle动态查询,sql,oracle,Sql,Oracle,我有一个简单的查询,普通的select语句,我想过滤用户提供的值 SELECT A,B,C,D,E FROM TAB WHERE .... 此处的WHERE不是固定的,即用户可以输入C的值,因此只应过滤C,或过滤D或e,依此类推。问题是由于用户告诉-filter callerID介于1和10之间等,但数据库列具有不同的名称。因此,要形成一个工作查询,我必须将callerID映射到columnName。由于这是在一个过程中,我考虑过传递userInputColumnNames的csv、dbCol
SELECT A,B,C,D,E FROM TAB
WHERE ....
此处的WHERE不是固定的,即用户可以输入C的值,因此只应过滤C,或过滤D或e,依此类推。问题是由于用户告诉-filter callerID介于1和10之间等,但数据库列具有不同的名称。因此,要形成一个工作查询,我必须将callerID映射到columnName。由于这是在一个过程中,我考虑过传递userInputColumnNames的csv、dbColumns的csv以及filter begin和start。然后费力地提取这些值,匹配正确的db列名并形成查询。这是可行的,但这是非常麻烦和不干净。有更好的方法吗?表中的列名是否会更改? 表中的列是否已添加/删除? 如果不是,您可以生成一个数字映射到表中的每一列,如下所示:
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”列
如果列名可以更改,或者列是动态添加/删除的,那么这将不起作用。您能在应用程序端处理这个问题吗?