在MySQL的COALESCE中选择

时间:2013-03-26 13:09:36

标签: mysql sql

我正在尝试在MySQL中执行以下操作:

UPDATE
    x
SET
    y = COALESCE(SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1,
                 SELECT z FROM table WHERE a = b AND c = d LIMIT 1,
                 SELECT z FROM table WHERE a = b LIMIT 1);

这对我来说听起来很有效。我正在尝试使用最合适的值更新列。如果我能找到符合3个标准的记录 - >这是我需要的那个。另外一个适合2个标准,否则记录只匹配一个标准。

我可以在3个更新查询中执行此操作,但我不明白为什么这不起作用。根据{{​​3}}:

COALESCE returns the first non-NULL value in the list, or NULL if there are no non-NULL values.

完全我需要什么。但它会出现以下错误:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT'

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:10)

您的问题可能是您获得的子选择返回的z值超过1 z。你只能得到一个。

你可以尝试:

update x
set y = (select z from t where a = b
         order by (case when a = b and c = d and e = f then 1
                        when a = b and c = d then 2
                        else 3
                   end)
         limit 1
        );

但是,您的特定语法错误是您需要围绕选择括号。所以这是语法上正确的版本:

UPDATE
    x
SET
    y = COALESCE((SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1),
                 (SELECT z FROM table WHERE a = b AND c = d LIMIT 1),
                 (SELECT z FROM table WHERE a = b LIMIT 1));

答案 1 :(得分:2)

如果没有更多细节,很难提出建议,但这样的事情可能有效

UPDATE
    x
SET y = COALESCE(
    ( SELECT z FROM table WHERE a = b AND c = d AND e = f LIMIT 1),
    ( SELECT z FROM table WHERE a = b AND c = d LIMIT 1 ),
    ( SELECT z FROM table WHERE a = b LIMIT 1 )
);

确保每个子查询最多只返回1行。