是否有可能在输出中检索哪个谓词在where子句中被评估为真?

时间:2016-10-15 11:02:41

标签: sql jpa criteria-api

是否有可能在一个select子句中有一个where子句,其中有很多谓词在输出中检索哪一个谓词被评估为true,以及实际元组?

例如,给定此表:

Table person
name        age         hair_color
Tom         12          Brown
Bob         27          Black
Sam         20          Red
Ann         15          Blonde
John        30          Blonde

该查询:

select *
from person
where (age >= 25) or (hair_color = 'Blonde')

我想输出类似的内容:

name        age         hair_color      clause_1        clause_2
Bob         27          Black           true            false
Ann         15          Blonde          false           true
John        30          Blonde          true            true

你有什么建议来获得类似的结果?

更新

谢谢!你回答了我的问题!所以可以用这样的东西:

select *
from (
    select p.*, 
        (age >= 25) as clause_1, 
        (hair_color = 'Blonde') as clause_2
    from test.person as p
) as t
where t.clause_1 or t.clause_2

现在我有一个相关的。如果我已经有一个易于包含此子句评估的表格,例如' check_1'和' check_2'。

Table person
name        age         hair_color      check_1     check_2
Tom         12          Brown
Bob         27          Black
Sam         20          Red
Ann         15          Blonde
John        30          Blonde

有什么方法可以临时使用'在select查询期间对该字段进行增值(check_1 = clause_1,check_2 = clause_2)?

name        age         hair_color      check_1     check_2
Bob         27          Black           true        false
Ann         15          Blonde          false       true
John        30          Blonde          true        true

我问你,因为我在Java项目中需要它,我在其中使用JPA和Criteria API来进行类型查询,我想得到对象' Person'用'检查'一次性评估价值。

再次感谢大家!

2 个答案:

答案 0 :(得分:2)

你可以包装条件:

select *
from (
  select p.*, 
         (age >= 25) as condition_1, 
         (hair_color = 'Blonde') as condition_2
  from person p
) t
where condition_1 or condition_2

以上是标准SQL,并假设使用的DBMS支持正确的boolean数据类型。

我不确定优化器在降低条件方面有多聪明,所以这可能比原始查询慢。

答案 1 :(得分:1)

类似的东西:

select name, age, hair_color, (age >= 25) AS Clause1, (hair_color like 'Blonde') AS Clause2
from person
where (age >= 25) or (hair_color like 'Blonde')

应该做的。

旁注like没有%很奇怪