我想在IFNULL语句中使用子查询
SELECT t.col1
, IFNULL(t.col2, (SELECT an.col_11
FROM another_table an
WHERE an.col1 = t.col5)) as alias_name
, t.col3
FROM table t;在IFNULL语句中,第二个表达式应该是子查询。
请给我正确的语法我的实际查询是
SELECT u.username, up.gender, d.name, desg.name,
IFNULL(up.creative_lead_id,
(SELECT au.username FROM auth_user au
WHERE au.id=up.creative_lead_id)) as creative_lead, up.image
FROM user_profile up, department d, designation, auth_user
WHERE up.department_id=d.id
AND up.designation_id = desg.id up.auth_uesr_id = u.id;由于IFNULL语句,此查询出现语法错误。
发布于 2014-09-18 15:22:08
您可以使用join重写查询,关联查询将对表中的每一行执行,这可能会影响性能
SELECT
t.col1,
IFNULL(t.col2, an.col_11) AS alias_name,
t.col3
FROM
`table` t
LEFT JOIN another_table an
ON an.col1 = t.col5 发布于 2014-09-18 15:22:56
在这种情况下,不要使用子查询,而是尝试使用类似的查询(使用联合):
SELECT t.col1
,IFNULL(t.col2, an.col_11) AS alias_name
,t.col3
FROM your_table t
LEFT JOIN another_table an ON an.col1 = t.col5在完整查询中,对IFNULL子句使用了两次up.creative_lead_id (一次作为第一个参数,然后在子查询中)。这没有任何意义,因为如果第一个参数是NULL,您的子查询将不会返回任何结果!
为了向您展示解决问题的原理,我刚刚将第一个参数替换为一个我称为up.creative_lead的虚构参数。这个虚构的列是存储在表user_profile中的创意lead的名称,如果此值为null,我将查找与creative_lead_id对应的用户的username。
下面是完整的查询,它将通过上面提到的更正解决您的问题:
SELECT u.username
,up.gender
,d.name
,desg.name
,IFNULL(up.creative_lead, cl.username) AS creative_lead
,up.image
FROM user_profile up
INNER JOIN department d ON d.id = up.department_id
INNER JOIN designation desg ON desg.id = up.designation_id
INNER JOIN auth_user u ON u.id = up.auth_user_id
INNER JOIN auth_user cl ON cl.id = up.creative_lead_id请注意,我更改了查询的语法,强烈建议您避免使用旧的连接语法(改为使用显式的 JOIN 子句)。
希望这能对你有所帮助。
https://stackoverflow.com/questions/25906528
复制相似问题