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

我将在前言中说我远不是SQL专家。 使用Excel我想使用一个特定的单元格作为查询的input,但我碰到一个问题,我创build的列没有定义为一列。 请帮忙。

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 

最后的IP地址就是问题所在。

编辑1:添加SQL语句的附加信息来绘制整个图片(最初遗漏了不相关的数据)

好的,所以首先你需要停止使用旧式连接,因为这里列出的所有原因。

你也会碰到一个问题,你不join任何比你的表之一。 我很确定这不会给你你正在寻找的结果。

最后你需要考虑操作的顺序。 由于WHERE子句在select之前被计算,所以不能在where子句中引用别名。 您只能使用ORDER BY或通过使用子查询或cte来引用别名。

但是,您可以在where子句中使用您的大小写expression式。 示例如下。

 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 

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

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

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

 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=?))