2017-08-07 59 views
0

我正在使用mysql中的sql查询。我的查询是这样的,where条款中的未知列与case + union + like

select reqId,sDate,stitle,sType,status,reqUser,assignedTo from 
(select request_id as reqId,date as sDate,title as sTitle,type as sType,status as status,request_user as reqUser , 
case when status='posted' then fbuser.name 
    when status='awaiting approval' then fbmanager.name 
    when status='approved' then fbAdmin.name 
    when status='rejected' then fbAdmin.name 
else null 
end as assignedTo 
from fb_requests fr 
left join users fbuser on (fr.reqUser = fbuser.id) 
left join users fbmanager on (fr.managerid= fbmanager.id) 
left join users fbAdmin on (fr.adminin = fbAdmin.id) 
where 1=1 
and (upper(assignedTo) like upper('abc')) 
UNION 
select request_id as reqId,date as sDate,title as sTitle,type as sType,status as status,request_user as reqUser , 
case when status='posted' then fbuser.name 
    when status='awaiting approval' then fbmanager.name 
else null 
end as assignedTo 
from fb_wall_posts fw 
left join users fbuser on (fw.request_by_id = fbuser.id) 
left join users fbmanager on (fw.manager_id= fbmanager.id) 
where 1=1 
and (upper(assignedTo) like upper('abc'))) 

这里我得到'unknown column assignedTo'。任何人都可以帮我解决这个问题。预先感谢有价值的答复。

+0

看起来像stitle和sTitle区分大小写? –

+1

第一个子查询确实是upper(assignedTO),但assignedTo不是fb_requests,fbuser,fbmanager或fbadmin中的值。它是基于状态和名称的派生值。因此,你需要在where子句中使用相同的case语句,因为操作顺序规定了表连接首先发生在where子句中。因此,在where子句被评估时,select和派生别名不在范围内。 – xQbert

回答

1

不能使用在状态的时候,你需要你必须重复代码

select reqId,sDate,stitle,sType,status,reqUser, assignedTo from 
    (select request_id as reqId,date as sDate,title as sTitle,type as sType,status as status,request_user as reqUser , 
    case when status='posted' then fbuser.name 
     when status='awaiting approval' then fbmanager.name 
     when status='approved' then fbAdmin.name 
     when status='rejected' then fbAdmin.name 
    else null 
    end as assignedTo 
    from fb_requests fr 
    left join users fbuser on (fr.reqUser = fbuser.id) 
    left join users fbmanager on (fr.managerid= fbmanager.id) 
    left join users fbAdmin on (fr.adminin = fbAdmin.id) 
    where 1=1 
    and (upper(
     case when status='posted' then fbuser.name 
      when status='awaiting approval' then fbmanager.name 
      when status='approved' then fbAdmin.name 
      when status='rejected' then fbAdmin.name 
     else null 
     end 
) like upper('abc')) 
    UNION 
    select request_id as reqId,date as sDate,title as sTitle,type as sType,status as status,request_user as reqUser , 
    case when status='posted' then fbuser.name 
     when status='awaiting approval' then fbmanager.name 
    else null 
    end as assignedTo 
    from fb_wall_posts fw 
    left join users fbuser on (fw.request_by_id = fbuser.id) 
    left join users fbmanager on (fw.manager_id= fbmanager.id) 
    where 1=1 
    and (upper(
    case when status='posted' then fbuser.name 
     when status='awaiting approval' then fbmanager.name 
     else null 
    end 
    ) like upper('abc'))) 
0

它看起来像你(你可以在组一些MySQL版本通过使用别名按顺序)别名在UNION关键字之前丢失了一个右括号。

1

当where子句执行时,AssignedTo还未定义,因此您必须使用完整的case语句,因为别名尚未创建。

select reqId,sDate,stitle,sType,status,reqUser,assignedTo from 
(select request_id as reqId,date as sDate,title as sTitle,type as sType,status as status,request_user as reqUser , 
case when status='posted' then fbuser.name 
    when status='awaiting approval' then fbmanager.name 
    when status='approved' then fbAdmin.name 
    when status='rejected' then fbAdmin.name 
else null 
end as assignedTo 
from fb_requests fr 
left join users fbuser on (fr.reqUser = fbuser.id) 
left join users fbmanager on (fr.managerid= fbmanager.id) 
left join users fbAdmin on (fr.adminin = fbAdmin.id) 
where 1=1 
and (upper(case when status='posted' then fbuser.name 
    when status='awaiting approval' then fbmanager.name 
    when status='approved' then fbAdmin.name 
    ) like upper('abc')) 
UNION 
select request_id as reqId,date as sDate,title as sTitle,type as sType,status as status,request_user as reqUser , 
case when status='posted' then fbuser.name 
    when status='awaiting approval' then fbmanager.name 
else null 
end as assignedTo 
from fb_wall_posts fw 
left join users fbuser on (fw.request_by_id = fbuser.id) 
left join users fbmanager on (fw.manager_id= fbmanager.id) 
where 1=1 
and (upper(case when status='posted' then fbuser.name 
    when status='awaiting approval' then fbmanager.name 
    when status='approved' then fbAdmin.name 
    ) like upper('abc'))) 
+0

Tq你救了我的一天。 – Hits