where子句中的别名

时间:2019-08-08 09:03:09

标签: mysql sql

我正在尝试执行此查询,该查询在where子句中包含别名,但它表示未知列。这是专栏:

select a.asofdate, pi.PShipEntID,  ass.firmentid, ass.firmorindentid, concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) roles,
    case when roles like '%(BM)%' then concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) else null end boardmember,
    case when concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) like '%(BO)%' then concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) else null end boardobserver,
    case when concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) like '%(PRP)%' then concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) else null end primaryresponsiblepartner,
    case when concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) like '%(SRP)%' then concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) else null end secondaryresponsiblepartner
    from asofdates a
left join associations ass
on a.asofdate > ass.StartDate
left join pshipinvestments pi
on pi.CompEntID = ass.FirmEntID
left join entities e 
on ass.firmorindentid = e.InvEntID
left join individuals ind
on ind.indentid = e.InvEntID

我知道此查询很痛苦,并且在这种情况下我不能使用别名,但是无论如何,是否可以简化此查询而不是使用复杂的表达式在任何地方进行连接? 如在情况中,用case语句中的别名替换此表达式concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle))。 预先感谢。

3 个答案:

答案 0 :(得分:1)

我认为这可能会有所帮助。

select * from (your above mentioned query)

,然后在where子句中使用它。

答案 1 :(得分:0)

您需要使自己成为子查询,然后在那里做一次工作。然后,您可以反复使用该列。检查以下内容,很显然我无法运行它,因为您尚未提供任何示例数据:)

select a.asofdate, pi.PShipEntID,  ass.firmentid, ass.firmorindentid,
a.Name roles,
    case when roles like '%(BM)%' then a.Name else null end boardmember,
    case when a.Name like '%(BO)%' then a.Name else null end boardobserver,
    case when a.Name like '%(PRP)%' then a.Name else null end primaryresponsiblepartner,
    case when a.Name like '%(SRP)%' then a.Name else null end secondaryresponsiblepartner
    from
    (
    select
    concat(concat(substring(ind.FirstName, 1, 1),' ',ind.lastname, ' '),initials(ass.empltitle)) as Name,
    *   
    asofdates
    ) a
left join associations ass
on a.asofdate > ass.StartDate
left join pshipinvestments pi
on pi.CompEntID = ass.FirmEntID
left join entities e 
on ass.firmorindentid = e.InvEntID
left join individuals ind
on ind.indentid = e.InvEntID
where a.Name = 'Albert'

答案 2 :(得分:0)

我没有看到任何where子句。

但是,MySQL扩展了having的使用来处理非聚合查询。并且可以使用别名。

因此,您可以使用:

having boardobserver = @boardobserver