【问题标题】:Oracle dynamic queryOracle 动态查询
【发布时间】:2011-09-22 05:56:08
【问题描述】:

我有一个简单的查询,香草选择语句,我想过滤用户提供的值。

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

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

【问题讨论】:

  • 你能在应用端处理这个吗?

标签: sql oracle


【解决方案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”列。

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

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多