带有子查询的IFNULL的mysql语法

时间:2014-09-18 07:18:47

标签: mysql ifnull

我想在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语句,此查询出现语法错误。

2 个答案:

答案 0 :(得分:1)

您可以使用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 

答案 1 :(得分:0)

在这种情况下不要使用子查询,请尝试这样的查询(使用关节):

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

在完整查询中,您为up.creative_lead_id子句使用了两次IFNULL(一次作为第一个参数,然后在子查询中)。这没有任何意义,因为如果第一个参数是NULL,那么你的子查询将不会返回任何结果!

为了向您展示将解决您的问题的原则,我只是用我称之为up.creative_lead的虚构的替换了第一个参数。此虚拟列是存储在表user_profile中的广告素材线索的名称,如果此值为空,则我会查找与username对应的用户的creative_lead_id

以下是完整的查询,通过上述纠正解决您的问题:

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子句)。

希望这会对你有所帮助。