1

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

4

2 回答 2

1

您可以使用连接重写查询,相关查询将对表中的每一行执行,它可能会影响性能

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-18T07:22:08.047 回答
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_idIFNULL子句使用两次(一次作为第一个参数,然后在子查询中)。这是没有意义的,因为如果第一个参数是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子句)。

希望这会帮助你。

于 2014-09-18T07:22:56.493 回答