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

问题描述 投票:0回答:5

想要的结果:

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

说明:

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

  1. 从表中选择*,其中column1 ='sometext'ANDcolumn2='1'
  2. SELECT * FROM 表 WHERE 列 1 = 'someothertext' AND 列 2='2'
  3. 从表中选择*,其中column1 ='somethirdtext'ANDcolumn2='3'

我想要得到 1 的结果。如果 1. 返回 NULL,我想要选择号 2. 的结果。如果选择号 2. 返回 NULL,我想使用选择号 3. 等等。

请注意,我期望每个为真的条件返回多行 - 并且我只想要 SELECT 1) 2) 或 3) 的结果(按该顺序)

仅返回单个 SELECT 表达式的结果非常重要,因此即使 2. 和 3. 会返回某些内容,我也只想要 1. 的结果。

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

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 ) ) ) 
mysql sql control-flow
5个回答
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
投票

我的处理方式略有不同,因为无论如何每个条件只能返回一行,我将使用以下内容来限制完成的选择数量:

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
的作用与以前相同,按条件匹配进行排序。然后获取第一个匹配的列的值,并将整个表限制为该值。

SQL Fiddle 示例


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 ;

0
投票

%sql select * from df where concat(姓名,年龄) in (选择合并((从df中选择不同的concat(姓名,年龄),其中姓名='鲍勃'且年龄= 25), (从 df 中选择不同的 concat(name,age),其中 name='Sam' 且age = 20), (从 df 中选择不同的 concat(name,age),其中 name='Rom' 且age = 45) ) )


-1
投票

MySQL 不是我的日常数据库,所以我可能对此不以为然,但是你不能在子查询上使用 LIMIT 1 吗?

© www.soinside.com 2019 - 2024. All rights reserved.