在SQL / Excel中获取无效的列名称

时间:2015-03-27 16:13:28

标签: sql-server excel

我将在前言中说我远不是SQL的专家。使用Excel我试图使用一个特定的单元格作为查询的输入,但我遇到一个问题,我创建的列没有被定义为列。请帮忙。

 SELECT
CASE  
WHEN CHARINDEX(',', TCPIPADDRESS) > 0 THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) ELSE TCPIPADDRESS END AS IPADDRESS,   
ADMachine.ADMachineName, ADMachine.SerialNumber, 
ADMachine.OperatingSystem, ADUsers.ADUser, ADUsers.ADDisplayName, employee_data.employee_first_name, 
employee_data.employee_last_name, asset_center.LOCATION_SITENAME, asset_center.TCPIPHOSTNAME, 
asset_center.MAC_ADDRESS, ADUsers.ADUserOU
FROM PC_GAP.dbo.ADMachine ADMachine, PC_GAP.dbo.ADUsers ADUsers, PC_GAP.dbo.asset_center asset_center, PC_GAP.dbo.employee_data employee_data
WHERE ADUsers.ADUser = employee_data.employee_user_name AND ADMachine.SerialNumber = asset_center.SERIALNO AND ADUsers.ADUser = asset_center.LAST_LOGGED_ON_USER 

最后的IPAddress是问题所在。

编辑1:添加了SQL语句中的附加信息以绘制整个图片(最初省略了无关数据)

2 个答案:

答案 0 :(得分:3)

好吧首先,你需要停止使用旧样式连接,因为here列出了所有原因。

您还将遇到一个问题,即除了某个表之外,您没有加入任何其他表。我很确定这不会给你你想要的结果。

然后最后你需要考虑operations的顺序。由于在select之前评估WHERE子句,因此无法在where子句中引用别名。您只能使用ORDER BY或使用子查询或cte引用别名。

但是,您可以在where子句中使用案例表达式。示例如下。

CASE
  WHEN CHARINDEX(',', TCPIPADDRESS) > 0 
  THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) 
  ELSE TCPIPADDRESS 
END = ?  

如前所述,您还可以将整个事物转换为子查询。我会用你的代码作为例子,但我不完全确定你希望用你当前的连接集完成什么,所以我的例子会有点泛泛。

select
    GenericColumn
    (select
        blah as Pity,
        GenericColumn
    from dbo.TheFoo)
where Pity = SeachCondition

答案 1 :(得分:2)

您不能在WHERE子句中使用列别名。您必须使用别名的整个公式。

WHERE ADMachine.SerialNumber = asset_center.SERIALNO AND ((CASE  
WHEN CHARINDEX(',', TCPIPADDRESS) > 0 THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) ELSE TCPIPADDRESS END=?))

为了说明亚伦的建议,它看起来更像是这样:

WITH cte AS (
SELECT    
CASE  
  WHEN CHARINDEX(',', TCPIPADDRESS) > 0 THEN LEFT(TCPIPADDRESS, CHARINDEX(',', TCPIPADDRESS) - 1) ELSE TCPIPADDRESS END AS IPADDRESS,   
ADMachine.ADMachineName,  
ADMachine.OperatingSystem,
asset_center.MAC_ADDRESS,

FROM PC_GAP.dbo.ADMachine ADMachine, PC_GAP.dbo.ADUsers ADUsers, PC_GAP.dbo.asset_center asset_center, PC_GAP.dbo.employee_data employee_data
)
  SELECT * FROM cte
WHERE ADMachine.SerialNumber = asset_center.SERIALNO AND ((IPAddress=?))