仅返回第一个真正遇到的SELECT表达式的结果。
所以,我有三种不同的SELECT表达式:
我希望得到的结果为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 ) ) )
答案 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吗?