sql 2005 case case - неверное имя столбца - PullRequest
1 голос
/ 23 июня 2009

Может кто-нибудь сказать мне, почему я получаю ошибку: Сообщение 207, уровень 16, состояние 1, процедура ExtractPDP4FromPDP, строка 21 Неверное имя столбца 'ContainsEX'.

при выполнении следующей хранимой процедуры.

CREATE PROCEDURE ExtractPDP4FromPDP 
    -- Add the parameters for the stored procedure here
AS
BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT PDP.*, LEFT(PDPCode,7) AS PDP7, PDP.Obsolete, 
        PDP.InvestorPDP, PDP.OnlineReport, PDP.ClientSpecific, 
        ContainsEX = CASE 
    WHEN(CHARINDEX(Left(PDPCode,5),'EX')>0) THEN 'True'
    ELSE 'False'
END, PDP4 =
CASE 
    WHEN ContainsEX = 'True' THEN 'E' & SUBSTRING(pdpcode,5,3)
    ELSE SUBSTRING(pdpcode,6,3)
END
FROM PDP
WHERE (((PDP.Obsolete)='False') AND ((PDP.InvestorPDP)='True') AND 
    ((PDP.OnlineReport)='False') AND ((PDP.ClientSpecific)='False'));  
END
GO

Заранее спасибо

Ответы [ 3 ]

7 голосов
/ 23 июня 2009

Sql Server не позволяет ссылаться на поля одного уровня. Вам нужно создать подзапрос, например:

select *,
    PDP4 = CASE 
        WHEN ContainsEX = 'True' THEN 'E' & SUBSTRING(pdpcode,5,3)
        ELSE SUBSTRING(pdpcode,6,3)
    END
from (
    select *, LEFT(PDPCode,7) AS PDP7, PDP.Obsolete, 
        PDP.InvestorPDP, PDP.OnlineReport, PDP.ClientSpecific, 
        ContainsEX = CASE 
            WHEN(CHARINDEX(Left(PDPCode,5),'EX')>0) THEN 'True'
            ELSE 'False'
        END
    from PDP
    WHERE (((PDP.Obsolete)='False') AND ((PDP.InvestorPDP)='True') AND 
   ((PDP.OnlineReport)='False') AND ((PDP.ClientSpecific)='False'))
) sub
1 голос
/ 23 июня 2009

Вы не можете использовать столбец в выражении сразу после его определения.

Одна альтернатива - использовать составные CTE для построения выражений или использовать вложенные запросы:

WITH cte1 AS (
    SELECT x, x AS y
    FROM t
),cte2 AS (
    SELECT x, y, x + y AS z
    FROM cte1
)
SELECT x, y, z
FROM cte2
0 голосов
/ 17 августа 2009

Ваш регистр неверен. Случай, когда «значение» = «значение», ТО 'сделать что-то вроде CONTAINEX =' бабушка 'END

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