我想在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语句,此查询出现语法错误。
答案 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
子句)。
希望这会对你有所帮助。