MYSQL:仅返回第一个真正遇到的SELECT表达式的结果

时间:2013-09-26 12:33:08

标签: mysql sql control-flow

期望的结果:

仅返回第一个真正遇到的SELECT表达式的结果。

说明:

所以,我有三种不同的SELECT表达式:

  1. SELECT * FROM table WHERE column1 ='sometext'AND column2 ='1'
  2. SELECT * FROM table WHERE column1 ='someothertext'AND column2 ='2'
  3. SELECT * FROM table WHERE column1 ='somethirdtext'AND column2 ='3'
  4. 我希望得到的结果为1.如果1.返回NULL,我希望选择数字2的结果。如果选择数字2返回NULL,我想使用选择数字3,依此类推。

    请注意,我希望每个条件都返回多行,而且我只想要SELECT 1)2)或3)的结果(按此顺序)

    重要的是只返回单个SELECT表达式的结果,所以即使2.和3.会返回一些东西,我也只想得到1的结果。

    我现在拥有的代码遵循预期的逻辑但是当我有一些以下SELECTS返回多行时,它给了我错误:

    1242 - 子查询返回超过1行

    现在的代码:

    SELECT  IFNULL( (SELECT * FROM table WHERE  column = 'sometext'), IFNULL( (SELECT *    FROM table WHERE  column = 'someothertext'), IFNULL( (SELECT * FROM table WHERE  column = 'somethirdtext'), 0 ) ) ) 
    

4 个答案:

答案 0 :(得分:1)

您正在寻找COALESCE功能。

SELECT COALESCE(
    (SELECT col FROM t WHERE `column` = 'sometext'),
    (SELECT col FROM t WHERE `column` = 'someothertext'),
    (SELECT col FROM t WHERE `column` = 'somethirdtext')
);

- 请注意,子查询不应返回超过1行/列。

答案 1 :(得分:1)

我会略微区别对待,因为无论如何你只能为每个条件返回一行,我会使用以下内容来限制完成的选择次数:

SELECT  *
FROM    table 
WHERE   column IN ('sometext', 'someothertext', 'somethirdtext')
ORDER BY CASE column 
            WHEN 'sometext' THEN 1
            WHEN 'someothertext' THEN 2
            WHEN 'somethirdtext' THEN 3
        END
LIMIT 1;

正如评论中所指出的,您也可以使用FIELD进行排序:

SELECT  *
FROM    table 
WHERE   column IN ('sometext', 'someothertext', 'somethirdtext')
ORDER BY FIELD(column, 'sometext', 'someothertext', 'somethirdtext')
LIMIT 1;

我认为您可以使用以下条件获得每个条件的多行:

SELECT  T.*
FROM    Table T
        INNER JOIN
        (   SELECT  Column
            FROM    Table
            WHERE   column IN ('sometext', 'someothertext', 'somethirdtext')
            ORDER BY FIELD(column, 'sometext', 'someothertext', 'somethirdtext')
            LIMIT 1
        ) MinT
            ON MinT.Column = T.Column;

基本上子查询MinT与以前相同,按任何条件匹配排序。然后获取第一个匹配列的值,并将整个表限制为该值。

<强> Example on SQL Fiddle

答案 2 :(得分:1)

SELECT t.*
FROM 
      ( SELECT o.column1, o.column2
        FROM 
            ( SELECT 1 AS ord, 'sometext' AS column1, '1' AS column2 UNION ALL
              SELECT 2,        'someothertext',       '2' UNION ALL
              SELECT 3,        'somethirdtext',       '3'
            ) AS o
        WHERE EXISTS
              ( SELECT 1
                FROM table AS td 
                WHERE td.column1 = o.column1
                  AND td.column2 = o.column2
              )
        ORDER BY o.ord 
            LIMIT 1
      ) AS d
    JOIN
      table AS t
        ON  t.column1 = d.column1
        AND t.column2 = d.column2 ;

答案 3 :(得分:-1)

MySQL不是我的每日数据库,所以我可能会对此不感兴趣,但是你不能在子查询中使用LIMIT 1吗?