[英]SQL invalid column name
进行左联接时,出现错误“无效的列名'FirstPart'”。
我知道我的专栏是别名,但是我不确定该怎么做:
SELECT
h.Type,
a.name,
CASE
WHEN a.name LIKE '%-%'
THEN LEFT(a.name, CHARINDEX('-', a.name) - 1)
ELSE a.name
END as FirstPart,
CASE
WHEN a.name LIKE '%-%'
THEN RIGHT(a.name, CHARINDEX('-', Reverse(a.v)) - 1)
END as LastPart
FROM
Table1 a
LEFT JOIN
Table2 h ON a.FirstPart = h.ID
如果将整个内容包装在外部查询中,则别名将可用,但是由于您与别名处于同一级别,因此需要使用相同的逻辑再次派生它:
Select
h.Type,
a.name,
CASE
WHEN a.name LIKE '%-%' THEN LEFT(a.name, Charindex('-', a.name) - 1)
ELSE a.name
END as FirstPart,
CASE
WHEN a.name LIKE '%-%' THEN RIGHT(a.name, Charindex('-', Reverse(a.v)) - 1)
END as LastPart
from Table1 a
left join Table2 h
on CASE WHEN a.name LIKE '%-%' THEN LEFT(a.name, Charindex('-', a.name) - 1) ELSE a.name END = h.ID
如果将其包装,则可以通过子查询进行引用:
select *
from
(Select h.Type, a.name,
CASE WHEN a.name LIKE '%-%' THEN LEFT(a.name, Charindex('-', a.name) - 1) ELSE a.name END as FirstPart,
CASE WHEN a.name LIKE '%-%' THEN RIGHT(a.name, Charindex('-', Reverse(a.v)) - 1) END as LastPart
from Table1 a ) inn
left join Table2 h
on inn.FirstPart = h.ID
附带说明一下,如果您可以避免参加like
比赛,那么您将获得更好的性能。
您可以使用子查询来使用别名
SELECT h.type,
a.name,
a.firstpart,
a.lastpart
FROM (SELECT name,
CASE WHEN name LIKE '%-%'
THEN LEFT(name, CHARINDEX('-', name) - 1)
ELSE name
END AS firstpart,
CASE WHEN name LIKE '%-%'
THEN RIGHT(name, CHARINDEX('-', REVERSE(v)) - 1)
END AS lastpart
FROM table1
) a
LEFT JOIN table2 h
ON a.firstpart = h.id
SQL Server提供了第四个选项(在重复表达式之后,使用子查询或使用CTE)。 。 。 apply
。 这很好,因为您可以“嵌套”表达式,而不必不断缩进代码:
Select h.Type, a.name, FirstPart, LastPart
from Table1 a cross apply
(values (CASE WHEN a.name LIKE '%-%' THEN LEFT(a.name, Charindex('-', a.name) - 1) ELSE a.name END,
CASE WHEN a.name LIKE '%-%' THEN RIGHT(a.name, Charindex('-', Reverse(a.v)) - 1) END)
) v(First_part, LastPart) left join
Table2 h
on v.FirstPart = h.ID;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.