Не можете использовать временный столбец в предложении where? - PullRequest
6 голосов
/ 23 декабря 2011
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'.

Просто интересно, как я могу ссылаться на этот временный столбец? Я искал предыдущие сообщения, в которых предлагалось использовать «иметь» для этого, но это тоже не работает.

Ответы [ 2 ]

9 голосов
/ 23 декабря 2011

Одним из решений было бы сделать отбор всего оператора, применив предложение 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

Или вы можете проверить каждое отдельное поле на 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
5 голосов
/ 23 декабря 2011

Вы должны либо использовать выражение в предложении WHERE, либо использовать свой запрос 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...