MySQL与附加条件合并

MySQL与附加条件合并,mysql,sql,Mysql,Sql,我有一个由几个列组成的结果集,这些列可能有空,也可能有空,也可能没有空。我想要第一个大于1的非空结果,合并我的列时添加这个次要条件的最佳方法是什么 e、 g 返回2 3和4如果 SELECT COALESCE(IF(col1>1,col1, NULL), IF(col2>1, col2, NULL), IF(col3>1, col3, NULL)) FROM tab SELECT COALESCE( NULLIF(col1, 1), NULLI

我有一个由几个列组成的结果集,这些列可能有空,也可能有空,也可能没有空。我想要第一个大于1的非空结果,合并我的列时添加这个次要条件的最佳方法是什么

e、 g

返回2 3和4

如果

SELECT COALESCE(IF(col1>1,col1, NULL), IF(col2>1, col2, NULL), IF(col3>1, col3, NULL))
FROM tab
SELECT COALESCE(
        NULLIF(col1, 1),
        NULLIF(col2, 1),
        NULLIF(col3, 1))

LAD205的答案是正确的,您必须为每一列设置一个if。但是,既然你必须要有这些if函数,你也可以这样做

SELECT IF(col1>1, col1, if(col2>1, col2, if (col3>1, col3, null)))
或者类似地

SELECT CASE WHEN col1>1 THEN col1
       WHEN col2>1 THEN col2
       WHEN col3>1 THEN col3
       ELSE null END

这两种方法中的任何一种都比使用coalesce更有效,所需的代码也更少,因为您仍然需要使用if来消除任何列中的任何1值

您可以使用单个
CASE
语句:

SELECT CASE WHEN IFNULL(col1, 0) > 1 THEN col1
            WHEN IFNULL(col2, 0) > 1 THEN col2
            WHEN IFNULL(col3, 0) > 1 THEN col3
       END
FROM mytable
这些案例也可以写成:

            WHEN colN IS NOT NULL AND colN > 1 THEN colN

如果我想将其扩展到多个列,我是否必须为每个列添加一个if?是的,您需要添加them@MiloHou如果有很多类似的列,您可能应该重新设计表。它们可能是一个新表,每个值都有一个单独的行。@Barmar我有4列要这样做,并且根据本例的结果,在我想要的结果中,其他列也有一个不同的值。在代码中多次重复这个大型Case语句会被RDBMS优化吗?
Case
语句不会影响查询从数据库中选择数据的方式。它将只在选定的行上执行。您不是在测试它们是否大于1。@Barmar谢谢。现在更好了吗?如果检查>1,则无需检查null是的,我看到了您的答案。我在检查这是为什么。通常在C#中,我总是先检查空值。如果你在测试>1,你不需要测试空值。你不能使用多个
ELSE
,也不需要最后一个
ELSE
,默认情况下会返回
null
@JuanCarlosOropeza。你对多余的其他人来说是对的,一个大脑的小嗝。更正。但我保留空值,因为我总是发现它更具可读性。
SELECT CASE WHEN IFNULL(col1, 0) > 1 THEN col1
            WHEN IFNULL(col2, 0) > 1 THEN col2
            WHEN IFNULL(col3, 0) > 1 THEN col3
       END
FROM mytable
            WHEN colN IS NOT NULL AND colN > 1 THEN colN