只使用一次扫描表,我是否可以获得大于给定值的最少2列

Rob*_*ert 0 sql sqlite

这是我的示例数据(没有索引,我不想创建任何索引):

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).

我相信只用一次传球就可以更快.这可能吗?

Gor*_*off 5

您想要使用条件聚合:

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)

此版本将根据您的条件返回最小值.如果其中一个条件没有行,它仍将返回另一个值的最小值.