我有一个(大型,多列)表,类似于:
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中进行过滤。
答案 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