来自[table]时[new column not null]

时间:2013-04-17 09:00:06

标签: sql sql-server-2012 select-query

我已经编写了一个查询,用于从不同的表中选择一些带有union all的结果。 从你可以使用的地方。 在那里,我想使用我在查询中'做'的列。 我怎么能这样做?

示例

 SELECT    
    [column1] AS 'K1', 
    ISNULL([column2], 'else')  + ' ' + ISNULL([column3], 'else') AS 'K2'    
 FROM 
    [table]  
 FULL JOIN
    [table] ON A.Name = C.AccountIdName 
 WHERE
    A.Name IS NOT NULL  
    AND K1 IS NOT NULL

是否可以将K1带入哪里? 或者还有其他选择吗?


更新:新示例

SELECT    
        [column1] AS 'K1', 
        ISNULL([column2], 'else')  + ' ' + ISNULL([column3], 'else') AS 'K2'    
     FROM 
        [table]  
     FULL JOIN
        [table] ON A.Name = C.AccountIdName 
     WHERE
        A.Name IS NOT NULL  
        **AND K1 IS NOT NULL
        AND K3 IS NOT NULL**

UNION ALL

SELECT    
        [column1] AS 'K1', 
        ISNULL([column2], 'else')  + ' ' + ISNULL([column3], 'else') AS 'K2'    
     FROM 
        [table]  
     FULL JOIN
        [table] ON A.Name = C.AccountIdName 
     WHERE
        A.Name IS NOT NULL  
        **AND K2 IS NOT NULL 
        AND K4 IS NOT NULL**

正如你所见,我想在第一个选择K1和K3,在第二个我想要K2结束K4

我希望你也能解决这个问题,这是一个很好的解决方案。

SELECT * FROM 
(
 SELECT [column1] as 'K1' , ISNULL([column2], 'else') + ' ' + ISNULL([column3], 'else') as 'K2' 
 FROM [table] full join [table] on A.Name = C.AccountIdName where A.Name IS NOT NULL
) 
res WHERE res.K1 IS NOT NULL

4 个答案:

答案 0 :(得分:0)

您可以使用它,但作为子查询的结果

SELECT * FROM 
(
 SELECT [column1] as 'K1' , ISNULL([column2], 'else') + ' ' + ISNULL([column3], 'else') as 'K2' 
 FROM [table] full join [table] on A.Name = C.AccountIdName where A.Name IS NOT NULL
) 
res WHERE res.K1 IS NOT NULL

<强>已更新

SELECT * FROM 
(
   SELECT [column1] as 'K1' , ISNULL([column2], 'else') + ' ' + ISNULL([column3], 'else') as 'K2' 
   FROM [table] full join [table] on A.Name = C.AccountIdName where A.Name IS NOT NULL
) 
res1 WHERE res1.K1 IS NOT NULL AND res1.K3 IS NOT NULL
UNION ALL
SELECT * FROM 
(
   SELECT [column1] as 'K1' , ISNULL([column2], 'else') + ' ' + ISNULL([column3], 'else') as 'K2' 
   FROM [table] full join [table] on A.Name = C.AccountIdName where A.Name IS NOT NULL
) 
res2 WHERE res2.K2 IS NOT NULL AND res2.K4 IS NOT NULL //BUT DOES IT HAS K4???

答案 1 :(得分:0)

不幸的是,您无法在同一级别创建的ALIAS子句上使用WHERE。有两种选择可以做:

使用原始列:

SELECT  [column1] as 'K1' , 
        ISNULL([column2], 'else') + ' ' + ISNULL([column3], 'else') as 'K2' 
FROM    [table] full join [table] 
          on A.Name = C.AccountIdName 
where   A.Name IS NOT NULL AND [column1] IS NOT NULL

或者用子查询包装它:

SELECT K1, K2
FROM
(
    SELECT  [column1] as 'K1' , 
            ISNULL([column2], 'else') + ' ' + ISNULL([column3], 'else') as 'K2' 
    FROM    [table] full join [table] 
              on A.Name = C.AccountIdName
    where   A.Name IS NOT NULL
) s
WHERE K1 IS NOT NULL

答案 2 :(得分:0)

您需要使用子查询或CTE:

;WITH CTE AS
(
 SELECT    
    [column1] AS 'K1', 
    ISNULL([column2], 'else')  + ' ' + ISNULL([column3], 'else') AS 'K2'    
 FROM 
    [table]  
 FULL JOIN
    [table] ON A.Name = C.AccountIdName 
 WHERE
    A.Name IS NOT NULL
) 
SELECT    
   K1, K2
FROM 
   CTE
WHERE
   K1 IS NOT NULL

答案 3 :(得分:0)

您可以检查Column1而不是K1,因为K1是别名,因此无法在where条件中使用。像:

SELECT 
    [column1] as 'K1' , 
    ISNULL([column2], 'else') + ' ' + ISNULL([column3], 'else') as 'K2' 
FROM [table] full join [table] on A.Name = C.AccountIdName 
where 
    A.Name IS NOT NULL AND 
    [column1] IS NOT NULL
相关问题