我在语法方面有点挣扎。
我尝试使用以下代码行,上边界由硬值和子查询或两个子查询确定,选择结果的最小值。
AND ELIGTY_MO_YYYYMM BETWEEN '201407' AND '201412'
预期的改变是:
AND ELIGTY_MO_YYYYMM BETWEEN '201407' AND min('201412', select max(contract boundary) from table blah)
或用另一个子查询替换'201412'
。
我希望这是一个简单的问题。任何见解将不胜感激=)
答案 0 :(得分:2)
有几件事......
比较两个值时,请使用LEAST
和GREATEST
。 MIN
和MAX
仅用于汇总。
将子查询用作列或表达式中的值时,请将子查询括在括号中。
AND ELIGTY_MO_YYYYMM BETWEEN '201407' AND
LEAST('201412, (SELECT MAX(whatever) FROM table))
答案 1 :(得分:1)
也许您希望使用least
代替。非常通用的例子:
select *
from yourtable
where someval between 0 and
least((select min(someval) from yourtable), (select max(someval) from yourtable))
答案 2 :(得分:0)
您可以用多种形式编写第二个where子句:
因为fld< min(val1 , val2)
表示fld< val1 and fld< val2
,您可以说:
AND ELIGTY_MO_YYYYMM >=201407
AND ELIGTY_MO_YYYYMM<= 201412
AND ELIGTY_MO_YYYYMM<= (select max(contract_boundary) from table)
或者您可以使用case
声明:
AND ELIGTY_MO_YYYYMM >=201407
AND ELIGTY_MO_YYYYMM <= (
select max( case
when contract_boundary<201412 then 201412
else contract_boundary end)
from table)
或使用least
:
AND ELIGTY_MO_YYYYMM BETWEEN 201407 AND
LEAST(201412, (SELECT MAX(whatever) FROM table))