oracle SQL从表中计算关系值

oug3syen  于 12个月前  发布在  Oracle
关注(0)|答案(4)|浏览(171)

我有一个表,上面列有必须满足必备值的项目的质量。但用于检查的关系在一列中。
样品表:
| 项目|质量|实际值|关系|MustValue|
| --|--|--|--|--|
| 一|重量| 10 |<<的| 20 |
| 一|体积| 5 |>=个| 50 |
| B|体积| 12 |<=最大值| 10 |
我寻找一个SELECT来调出第2行和第3行,因为在这些行中,ActualValue超出了Relation & MustValue的范围。
结果应该是:
| 项目|质量|实际值|关系|MustValue|
| --|--|--|--|--|
| 一|体积| 5 |>=个| 50 |
| B|体积| 12 |<=最大值| 10 |
我希望有类似WHERE ActualValue CONVERT(Relation+MustValue).的东西让我们假设,Relation和MustValue是文本字段,Relation是一个有效的SQL关系。
我不知道该找什么功能。
如何才能做到这一点?我在一个Oracle数据库系统上工作。数据库模型是给定的,我只能访问SELECT。

pu82cl6c

pu82cl6c1#

WHERE子句中的嵌套CASE应该可以完成这项工作:

with data(Item, Quality, ActualValue, Relation, MustValue) as (
    select 'A', 'weight', 10, '<', 20 from dual union all
    select 'A', 'volume', 5, '>=', 50 from dual union all
    select 'B', 'volume', 12, '<=', 10 from dual -- union all
)
select * from data
where
    1 = 
    case relation
    when '<' then
        case when MustValue < ActualValue then 1 else 0 end
    when '>=' then
        case when MustValue >= ActualValue then 1 else 0 end
    when '<=' then
        case when MustValue <= ActualValue then 1 else 0 end
    end
;

字符串

rqqzpn5f

rqqzpn5f2#

我不知道该找什么功能。
SQL中没有函数(与其他语言中的EVAL类似)将动态计算作为SQL语句一部分的表达式。
相反,您可以使用CASE表达式并将您希望使用的关系列入白名单:用途:

SELECT *
FROM   table_name
WHERE  CASE
       WHEN relation = '<'  THEN CASE WHEN actualvalue <  mustvalue THEN 1 ELSE 0 END
       WHEN relation = '<=' THEN CASE WHEN actualvalue <= mustvalue THEN 1 ELSE 0 END
       WHEN relation = '>'  THEN CASE WHEN actualvalue >  mustvalue THEN 1 ELSE 0 END
       WHEN relation = '>=' THEN CASE WHEN actualvalue >= mustvalue THEN 1 ELSE 0 END
       WHEN relation = '='  THEN CASE WHEN actualvalue =  mustvalue THEN 1 ELSE 0 END
       WHEN relation = '!=' THEN CASE WHEN actualvalue != mustvalue THEN 1 ELSE 0 END
       END = 0;

字符串
其中,对于样本数据:

CREATE TABLE table_name (Item, Quality, ActualValue, Relation, MustValue) AS
SELECT 'A', 'weight', 10, '<',  20 FROM DUAL UNION ALL
SELECT 'A', 'volume',  5, '>=', 50 FROM DUAL UNION ALL
SELECT 'B', 'volume', 12, '<=', 10 FROM DUAL;


产出:
| 项目|质量|实际价值|关系|必须值|
| --|--|--|--|--|
| 一|体积| 5 |>=个| 50 |
| B|体积| 12 |<=最大值| 10 |
fiddle

tzdcorbm

tzdcorbm3#

您也可以使用xmlquery来计算表达式:

with data(Item, Quality, ActualValue, Relation, MustValue) as (
    select 'A', 'weight', 10, '<', 20 from dual union all
    select 'A', 'volume', 5, '>=', 50 from dual union all
    select 'B', 'volume', 12, '<=', 10 from dual -- union all
)
select Item, Quality, ActualValue, Relation, MustValue
from (
    select Item, Quality, ActualValue, Relation, MustValue, MustValue || ' ' || Relation || ' ' || ActualValue
    as Expr from data
)
where xmlquery(Expr returning content).getStringVal() = 'true' 
;

A   volume  5   >=  50
B   volume  12  <=  10

字符串

am46iovg

am46iovg4#

你可以编写自己的函数来计算表达式:

WITH
    Function eval_expr(expr VarChar2) RETURN Number IS
        BEGIN
            -- returns 1 if True  |  0 if False  |  9 if error
            Declare 
                cmd     VarChar2(512) := 'Select Case When ' || expr || ' Then 1 Else 0 End From Dual' ;
                chk     Number;
            Begin
                execute immediate cmd InTo chk;
                RETURN chk;
            Exception 
                When Others Then RETURN 9;
            End;
        END eval_expr;
    tbl AS    --  S a m p l e    D a t a :
        (   Select 'A' "ITEM", 'weight' "QUALITY", 10 "ACTUAL_VALUE", '<' "RELATION", 20 "MUST_VALUE" From Dual Union All
            Select 'A' "ITEM", 'volume' "QUALITY",  5 "ACTUAL_VALUE", '>=' "RELATION", 50 "MUST_VALUE" From Dual Union All
            Select 'B' "ITEM", 'volume' "QUALITY", 12 "ACTUAL_VALUE", '<=' "RELATION", 10 "MUST_VALUE" From Dual 
        )
--  M a i n   S Q L :
Select  * 
From    tbl
Where   eval_expr(ACTUAL_VALUE || RELATION || MUST_VALUE) = 0
      
/*    R e s u l t :
ITEM QUALITY ACTUAL_VALUE RELATION MUST_VALUE
---- ------  ------------ -------- ----------
A    volume             5 >=               50
B    volume            12 <=               10   */

字符串
这将检查在Case表达式的When子句中使用的任何有效表达式,包括多个条件与AND/OR...

相关问题