select cast(de.ApprovalOrder AS VARCHAR(32))
+ cast(de.EntityCode AS VARCHAR(32))
+ isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as 'RowID' ,
*
from workflow.delegation_engine de
where RowID <> NULL
当我尝试执行以下操作时,收到错误:
消息207,级别16,状态1,行13无效的列名称'RowID'。
只是想知道我如何引用这个临时列?我搜索了以前的帖子,建议使用“have”,但这似乎不起作用。
答案 0 :(得分:9)
一种解决方案是对整个语句进行子选择,在结果上应用where子句
select *
from (
select cast(de.ApprovalOrder AS VARCHAR(32))
+ cast(de.EntityCode AS VARCHAR(32))
+ isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as 'RowID'
, *
from workflow.delegation_engine de
) de
where de.RowID IS NOT NULL
另一种解决方案可能是重复WHERE子句中的整个子句
select cast(de.ApprovalOrder AS VARCHAR(32))
+ cast(de.EntityCode AS VARCHAR(32))
+ isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as 'RowID' ,
*
from workflow.delegation_engine de
where cast(de.ApprovalOrder AS VARCHAR(32))
+ cast(de.EntityCode AS VARCHAR(32))
+ isnull(cast(de.DelegationCode AS VARCHAR(32)), '') IS NOT NULL
或者您可以测试每个字段的空白
select cast(de.ApprovalOrder AS VARCHAR(32))
+ cast(de.EntityCode AS VARCHAR(32))
+ isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as 'RowID' ,
*
from workflow.delegation_engine de
where de.ApprovalOrder IS NOT NULL
AND de.EntityCode IS NOT NULL
答案 1 :(得分:5)
您必须使用WHERE
子句中的express,或者使用SELECT
查询作为子查询,如下所示:
select *
from
(
select cast(de.ApprovalOrder AS VARCHAR(32))
+ cast(de.EntityCode AS VARCHAR(32))
+ isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as RowID,
*
from workflow.delegation_engine de
)
where RowID is not NULL
或者,更粗略的(在我看来)路线将是:
select cast(de.ApprovalOrder AS VARCHAR(32))
+ cast(de.EntityCode AS VARCHAR(32))
+ isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as RowID,
*
from workflow.delegation_engine de
where cast(de.ApprovalOrder AS VARCHAR(32))
+ cast(de.EntityCode AS VARCHAR(32))
+ isnull(cast(de.DelegationCode AS VARCHAR(32)), '') is not null
我每次都会选择第一个解决方案。
另请注意,我已从
更改了WHERE
条款
RowID <> NULL
要
RowID is not NULL
这是因为<> NULL
永远不会评估为真。 SQL Server使用NULL
和IS
测试IS NOT
(即未知)。