这是我的示例数据(没有索引,我不想创建任何索引):
CREATE TABLE tblTest ( a INT , b INT );
INSERT INTO tblTest ( a, b ) VALUES
( 1 , 2 ),
( 5 , 1 ),
( 1 , 4 ),
( 3 , 2 )
Run Code Online (Sandbox Code Playgroud)
我希望列a和列b的最小值都大于给定值.例如,如果给定的值是3,那么我想要返回4.
这是我目前的解决方案:
SELECT MIN (subMin) FROM
(
SELECT MIN (a) as subMin FROM tblTest
WHERE a > 3 -- Returns 5
UNION
SELECT MIN (b) as subMin FROM tblTest
WHERE b > 3 -- Returns 4
)
Run Code Online (Sandbox Code Playgroud)
这会搜索表两次 - 一次得到min(a)
一次min(b)
.
我相信只用一次传球就可以更快.这可能吗?
您想要使用条件聚合:
select min(case when a > 3 then a end) as minA,
min(case when b > 3 then b end) as minB
from tblTest;
Run Code Online (Sandbox Code Playgroud)
要获得这两个值的最小值,可以使用SQLite扩展,它可以处理多个值min()
:
select min(min(case when a > 3 then a end),
min(case when b > 3 then b end)
)
from tblTest
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,如果任一参数为NULL ,min
则返回NULL
.您可以通过以下方式解决此问题
select coalesce(min(min(case when a > 3 then a end),
min(case when b > 3 then b end)
),
min(case when a > 3 then a end),
min(case when b > 3 then b end)
)
from tblTest
Run Code Online (Sandbox Code Playgroud)
此版本将根据您的条件返回最小值.如果其中一个条件没有行,它仍将返回另一个值的最小值.