代码之家  ›  专栏  ›  技术社区  ›  Mithun Sreedharan Kuldeep Modi

SQL-从SELECT查询中排除列

sql
  •  6
  • Mithun Sreedharan Kuldeep Modi  · 技术社区  · 15 年前

    我有100列在一个表中,我想列出99列,除了一个特定的。

    如何排除该列名称?

    4 回复  |  直到 6 年前
        1
  •  6
  •   Community Mohan Dere    8 年前
    SELECT column_1, column_2, column_3, 
         /* ...the list of columns 4-97, not shown in this example... */,
         column_98, column_99
       FROM table
    

    尽管写起来很麻烦,但这实际上是一件好事:使用 SELECT * 不鼓励在生产中使用代码(出于性能和可维护性的原因)。 this question

        2
  •  7
  •   Martin Smith    13 年前

    这个 Tutorial D ALL BUT

    如果您通常需要相同的列集,则可以使用视图。

        3
  •  2
  •   Kirill Leontev    15 年前

    你不能。

    从理论上讲,这里可能会涉及动态sql—有些过程会循环遍历表的所有列(例如, all_tabs_columns Oracle中的dictionary视图列出了所有表的所有列),并形成一个 select c1, c2 c3 ... c99 from tab ,但我强烈反对你这样做。将为您节省几行代码,但使其难以维护。:)

        4
  •  1
  •   Simon Cadd    13 年前

    试试这个。

    DROP TABLE #MY_TEMP_TABLE
    
    CREATE TABLE #MY_TEMP_TABLE
    (
        Column_1        int             NULL,
        Column_2        varchar(10)     NULL,
        Column_3        datetime        NULL
    )
    
    INSERT INTO #MY_TEMP_TABLE(Column_1, Column_2, Column_3)
            SELECT  1, 'a', GETDATE()
    UNION   SELECT  2, 'b', GETDATE()
    UNION   SELECT  3, 'c', GETDATE()
    UNION   SELECT  4, 'd', GETDATE()
    
    DECLARE @dSQL nvarchar(1000)
    
    SELECT  @dSQL = 'SELECT TOP 10 '
    
    SELECT  @dSQL = @dSQL + LEFT(nst.ColumnList, LEN(nst.ColumnList)-1) --AS 'List'
    FROM    (SELECT  so.id
            FROM    TEMPDB..SYSOBJECTS so
            WHERE   so.name LIKE '#MY_TEMP_TABLE%'
            AND     so.type = 'u') so
    CROSS APPLY (SELECT sc.Name + ', '
                FROM    TEMPDB..SYSCOLUMNS sc
                WHERE   sc.id = so.id
                AND     sc.colid <> 3
                FOR XML PATH('')) nst
                (ColumnList)
    
    SELECT  @dSQL = @dSQL + ' FROM #MY_TEMP_TABLE'
    
    EXEC sp_executesql @dSQL
    
        5
  •  1
  •   double-beep hudson solomon    6 年前

    DECLARE @query nvarchar(max)=(SELECT string_agg(COLUMN_NAME,',') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='YOURTABLENAME'
    
    AND COLUMN_NAME NOT IN ('REMOVEDCOLOUMN',.........))
    
    SET @query ='select '+@query+' FROM YOURTABLENAME' EXEC sp_executesql @query;