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 | . . .
所有列都是varcharprop1
、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