仅返回第一个遇到的正确 SELECT 表达式的结果。
所以,我有三个不同的 SELECT 表达式:
我想要得到 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 ) ) )
您正在寻找 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 行/列。
我的处理方式略有不同,因为无论如何每个条件只能返回一行,我将使用以下内容来限制完成的选择数量:
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
的作用与以前相同,按条件匹配进行排序。然后获取第一个匹配的列的值,并将整个表限制为该值。
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 ;
%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) ) )
MySQL 不是我的日常数据库,所以我可能对此不以为然,但是你不能在子查询上使用 LIMIT 1 吗?