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

Sql Oracle:查询存储在其中一列中的键/值对?,sql,oracle,Sql,Oracle,我有一个(大的、多列的)表,类似于: prop1 | prop2 | prop3 | summary ------+-------+-------+---------------------------- | | | "prop1=X, prop2=Y, prop3=Z" ------+-------+-------+---------------------------- val | | | . . . ------+-----

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

prop1 | prop2 | prop3 | summary
------+-------+-------+----------------------------
      |       |       | "prop1=X, prop2=Y, prop3=Z"
------+-------+-------+----------------------------
  val |       |       | . . . 
------+-------+-------+----------------------------
      |       |   val | . . .
所有列都是varchar
prop1
prop2
等。列可能有值,也可能没有值。如果它们没有值,我需要使用
summary
列中的值进行筛选。那么,假设我有这个查询:

select * from T where prop1='val1' and prop2='val2' and prop3='val3'
我想添加一些内容:如果
prop1
为空,则从
summary
中提取
prop1
,并在
where
子句中使用它。这在甲骨文中可能吗?另外,考虑到这是一个可能包含数百万行的大型表,执行时间是否会成为一个考虑因素


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

我想知道case语句是否适合您的需要?我不确定我是否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

仍要执行第一个选择:

SELECT * FROM T WHERE prop1= :val1 AND prop2= :val2 AND prop3= :val3
但是添加一个
UNION
来处理任何属性为null的情况(将字符与null连接起来总是返回null)

处理空字符串的变量:

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

如果有机会,请以适当的方式存储这些值。如果您试图以这种方式获取值,性能总是会受到影响,这会使事情变得复杂。@PeterLang不幸的是,这是一个遗留系统,无法对现有数据进行太多更改。这通常是个问题,但实际上有人在设计这些表,有时可以阻止它们;)太棒了,这很管用。一个小的修正-由于'propN'是regexp等式的一部分,因此必须在两边都包含它,因此简单的
对于我的目的将起作用:
从T中选择*prop1=:val1或regexp_SUBSTR(摘要,'prop1=([^,]+)=('prop1='|:val1)
谢谢!
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