繁体   English   中英

SQL无效的列名

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM