在数据库中存储多个条件的映射

时间:2017-05-09 09:13:34

标签: sql database oracle oracle11g relational-database

我有一个SELECT-Statement,其中必须映射键。我需要将此映射存储为数据库,因为此映射可以更改。由于映射条件仅基于一个键,因此相对简单。

SELECT 
  table.flield1 AS COL1
, (SELECT value from TransformationTable WHERE key = table.field2) AS COL2
[...]

现在我有一个映射条件更复杂的情况。在SQL中它就像:

CASE
 WHEN table.field1 = 'ORG' AND table.field2 IN (1,2,3) THEN 01
 WHEN table.field1 = 'ORG' AND table.field2 NOT IN (5,76,88) OR IN (9) THEN 02
 WHEN table.field1 != 'ORG' AND table.field2 IN (1,2,3) THEN 03
END

如何在数据库中存储此类条件,以便我可以选择示例1中的值。

有人有想法吗?

2 个答案:

答案 0 :(得分:0)

基本上要执行此任务,您需要能够动态评估表达式的内容。我过去解决这类问题的唯一方法是:

  1. 易于实现但灵活性较低:将表达式嵌入视图中,然后从视图中查询;将视图更改为映射表达式更改。请记住,视图只是存储的SQL语句,SQL语句可以包含和评估复杂表达式。

  2. 更难实现但更灵活:在某个表格中存储表达式的词法结构;然后读入"表达"并用它来动态生成SQL;然后运行动态生成的SQL。

  3. 玩得开心!!!

答案 1 :(得分:0)

如果你想要一个表格解决方案,那么我想到这样的事情:

PARENT      | CHILD         | LOGICAL   | COLUMN        | OPERATOR  | VALUES  | OUTPUT    |
OPERATOR ID | OPERATOR ID   | OPERATOR  | (expression)  | OPERATOR  | VALUES  | ATTRIBUTE |
--------------------------- ---------------------------------------------------------------
10001       | 10003         | AND       | field1        | IN        | 1,2,3   | 01        |
10001       | 10004         | AND       | field2        | NOT IN    | 5,76,88 | 01        |
10002       | 10005         |           | field1        | IN        | ...     | 02        |
10002       | 10006         |           | field2        | NOT IN    | ...     | 02        |

PARENT OPERATOR IDCHILD OPERATOR ID是额外的,以防您需要嵌套 AND-OR运算符( ... AND ( ... OR ... AND ( ... OR ... ) ) )