Oracle:查询存储在其中一列中的键/值对?

时间:2015-06-05 16:46:06

标签: sql oracle

我有一个(大型,多列)表,类似于:

MessageBox

所有列都是varchars。 prop1 | prop2 | prop3 | summary ------+-------+-------+---------------------------- | | | "prop1=X, prop2=Y, prop3=Z" ------+-------+-------+---------------------------- val | | | . . . ------+-------+-------+---------------------------- | | val | . . . prop1等列可能有也可能没有值。如果他们没有值,我需要使用prop2列中的值进行过滤。所以,假设我有这个问题:

summary

我想添加一些内容:如果select * from T where prop1='val1' and prop2='val2' and prop3='val3' 为空,请从prop1中提取prop1并在summary子句中使用该where。这可能在Oracle中实现吗?另外,考虑到这是一个可能有数百万行的大型表,执行时间是否需要考虑?

不幸的是,无法在代码中进行过滤,因为查询也会进行分页并将当前页面传递给另一个系统,因此必须在SQL中进行过滤。

2 个答案:

答案 0 :(得分:0)

我想知道案件陈述是否符合您的需求?我不确定我是否100%理解你的问题,并且在moble上。也许是这样的:

Select * from from T 
where CASE when prop1 not null then prop1 ='val1'
           when prop2 not null then prop2 ='val2'
           when prop3 not null then prop3 ='val3'
      END

答案 1 :(得分:0)

无论如何要做第一个选择:

SELECT * FROM T WHERE prop1= :val1 AND prop2= :val2 AND prop3= :val3

但添加UNION来处理任何prop为null时的情况(连接字符与null始终返回null)

UNION SELECT * FROM T where prop1 || prop2 || prop3 IS NULL
 AND COALESCE( prop1, REGEXP_SUBSTR(summary,'prop1=([^,]+)') ) = :val1
 AND COALESCE( prop2, REGEXP_SUBSTR(summary,'prop2=([^,]+)') ) = :val2
 AND COALESCE( prop3, REGEXP_SUBSTR(summary,'prop3=(.+)') ) = :val3

处理空字符串的变体:

UNION SELECT * FROM T where LENGTH(prop1) * LENGTH(prop2) * LENGTH(prop3) = 0
 AND prop1 || REGEXP_SUBSTR(summary,'prop1=([^,]+)') = :val1
 AND prop2 || REGEXP_SUBSTR(summary,'prop2=([^,]+)') = :val2
 AND prop3 || REGEXP_SUBSTR(summary,'prop3=(.+)') = :val3