【问题标题】:from [table] when [new column is notnull]当 [新列不为空] 时来自 [表]
【发布时间】:2013-04-09 23:11:04
【问题描述】:

我编写了一个查询,用于从不同的表中选择一些结果,并使用 union all。 在from之后你可以使用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 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 en K3 中,在第二个中我想要 K2 end 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

【问题讨论】:

  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法突出显示它
  • tnx 告诉我下次我会使用它
  • 请不要在您的问题中添加“已解决”。我们已经知道您得到了一个对您有帮助的答案,这就是“接受的答案”复选框的用途。
  • 好的,感谢您为我更改它..

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


【解决方案1】:

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

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???

【讨论】:

  • K1 之前的“res”来自哪里??
  • @user2289664 res - 子查询结果集的名称。你可以随心所欲地调用它
  • tnx 为您解答我会使用它
  • 再次阅读我的问题,我已经更新它也许你可以再次帮助我
  • @user2289664 我不完全确定,但它看起来像是一个新问题,而不是对原始问题的澄清。
【解决方案2】:

很遗憾,您不能在同一级别上创建的WHERE 子句上使用ALIAS。有两种选择:

使用原列:

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

【讨论】:

    【解决方案3】:

    您需要使用子查询或 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
    

    【讨论】:

      【解决方案4】:

      您可以检查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
      

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 2021-06-18
        • 2020-08-23
        • 1970-01-01
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多