我将在前言中说我远不是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语句中的附加信息以绘制整个图片(最初省略了无关数据)
答案 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=?))