0

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

CREATE TABLE tblTest ( a INT , b INT );
INSERT INTO tblTest ( a, b ) VALUES
( 1 , 2 ),
( 5 , 1 ),
( 1 , 4 ),
( 3 , 2 )

我想要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
) 

这会搜索表两次——一次获取min(a)一次获取min(b)

我相信只需通过一次就可以更快地做到这一点。这可能吗?

4

2 回答 2

5

您想为此使用条件聚合:

select min(case when a > 3 then a end) as minA,
       min(case when b > 3 then b end) as minB
from tblTest;

要获得这两个值的最小值,您可以使用 SQLite 扩展,它处理多个值min()

select min(min(case when a > 3 then a end),
           min(case when b > 3 then b end)
          )
from tblTest

唯一的问题是,如果任一参数为 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

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

于 2013-07-17T14:41:50.267 回答
1

从我的脑海中,您可以修改表并添加一个最小值列来存储两列的最小值。然后查询该列。

或者你可以这样做:

select min(val)
from
(
    select min(col1, col2) as val
    from table1
)
where 
val > 3

外部 SELECT 查询内存,而不是表本身。

检查SQL 小提琴

于 2013-07-17T14:44:00.010 回答