【问题标题】:How to exclude one column from result? [duplicate]如何从结果中排除一列? [复制]
【发布时间】:2016-01-09 11:01:29
【问题描述】:

我有一个带有列的表格

a,b,c,d,e,f,g,...,z

是否可以编写一个简单的查询来提供除a 之外的所有列,而无需手动指定所有其他列?

相当于:

Select b,c,d,e,f,g,h,...z
from TableG

【问题讨论】:

  • 你的意思是像SELECT b to z FROM xxxx?我不这么认为!
  • 是的,我就是这个意思。
  • 我认为您必须明确提及要返回的列子集
  • 我知道的就这么多...但是表格有 43 列,我需要其中的 42 列。我想我会写一个查询,它会给我表列名,这样会更容易。
  • @SMW 创建一个类似create view vTableg selct b,..,..z from tableg 的视图,只要您需要这些列,只需调用select * from vTableg

标签: sql postgresql


【解决方案1】:
/************************************************************
Function To Split Strings
************************************************************/

SET QUOTED_IDENTIFIER ON
GO

IF OBJECT_ID('dbo.SplitString') IS NOT NULL
BEGIN
    DROP FUNCTION dbo.SplitString
END
GO

create function [dbo].[SplitString]
(
    @String varchar(max),
    @Delimiter char(1)
)
returns @SplittedValues table
(
    str_item varchar(100) primary key
)
as
begin
    declare @SplitLength int

    while len(@String) > 0
    begin 
        select @SplitLength = (case charindex(@Delimiter,@String) when 0 then
            len(@String) else charindex(@Delimiter,@String) -1 end)

        insert into @SplittedValues
        select substring(@String,1,@SplitLength) 

        select @String = (case (len(@String) - @SplitLength) when 0 then  ''
            else right(@String, len(@String) - @SplitLength - 1) end)
    end 
return  
end
GO


/************************************************************
Function To Get columns names excluding some of them
************************************************************/

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('dbo.get_columns') IS NOT NULL
BEGIN
    DROP FUNCTION dbo.get_columns
END
GO
CREATE FUNCTION dbo.get_columns 
(
   @table_name varchar(100),
   @excluded_column_names varchar(100),
   @delimter char(1)
)
RETURNS varchar(4000)
AS
BEGIN
    declare @cols varchar(4000)
    select @cols = COALESCE(@cols+',' ,'') + name
    from sys.columns 
    where object_id=object_id(@table_name) 
        and name not in (select str_item from dbo.SplitString(@excluded_column_names,@delimter))
    return @cols
END
GO


/************************************************************
Function To Get columns names excluding some of them
************************************************************/
declare @qry nvarchar(max)
set @qry = ' select ' + dbo.get_columns('TableName','Exclude_col_1,Exclude_col_2,Exclude_col_3',',') 
    + ' from TableName'
    + ' where condition'
EXECUTE sp_executesql @qry
GO

【讨论】:

  • 有两个函数 1.) SplitString 2.) get_columns。最后我展示了如何在动态查询中使用 get_columns 来排除列。
【解决方案2】:

要回答您的问题,您不能直接这样做,但是我为您找到了解决方案。

使用物理表时SQL的SELECT语句只能做SELECT *会返回所有列和SELECT Column1, Column2, Column3...针对特定列,没有WHERE条件会排除1 SQL 的SELECT 语句中的列名。您如何使用临时表

按照您想要的方式操作表格和数据

解决方案:

  1. 插入临时表
  2. 删除要从临时表中排除的列
  3. 从临时表中选择所有数据。

    SELECT * INTO #TempTable
    FROM TableG
    
    ALTER TABLE #TempTable
    DROP COLUMN a
    
    SELECT * FROM #TempTable
    
    DROP TABLE #TempTable
    

我在这里找到了解决方案:SQL exclude a column using SELECT * [except columnA] FROM tableA?

【讨论】:

  • 确实很有趣,但大表的性能可能会成为瓶颈。所以我建议在生产环境中应用这个解决方案之前三思而后行。尽管如此,对于简单的日常调试工作来说还是不错的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2012-03-10
  • 2019-05-30
  • 2016-04-02
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多