Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle动态查询_Sql_Oracle - Fatal编程技术网

Sql Oracle动态查询

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语句,我想过滤用户提供的值

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”列


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

您能在应用程序端处理这个问题吗?