SQL exclude a column using SELECT * [except columnA] FROM tableA?

后端 未结 30 2512
花落未央
花落未央 2020-11-21 23:15

We all know that to select all columns from a table, we can use

SELECT * FROM tableA

Is there a way to exclude column(s) from a table witho

相关标签:
30条回答
  • 2020-11-22 00:04

    No.

    Maintenance-light best practice is to specify only the required columns.

    At least 2 reasons:

    • This makes your contract between client and database stable. Same data, every time
    • Performance, covering indexes

    Edit (July 2011):

    If you drag from Object Explorer the Columns node for a table, it puts a CSV list of columns in the Query Window for you which achieves one of your goals

    0 讨论(0)
  • 2020-11-22 00:04
    DECLARE @SQL VARCHAR(max), @TableName sysname = 'YourTableName'
    
    SELECT @SQL = COALESCE(@SQL + ', ', '') + Name 
    FROM sys.columns
    WHERE OBJECT_ID = OBJECT_ID(@TableName)
    AND name NOT IN ('Not This', 'Or that');
    
    SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @TableName
    
    EXEC (@SQL)
    

    UPDATE:

    You can also create a stored procedure to take care of this task if you use it more often. In this example I have used the built in STRING_SPLIT() which is available on SQL Server 2016+, but if you need there are pleanty of examples of how to create it manually on SO.

    CREATE PROCEDURE [usp_select_without]
    @schema_name sysname = N'dbo',
    @table_name sysname,
    @list_of_columns_excluded nvarchar(max),
    @separator nchar(1) = N','
    AS
    BEGIN
     DECLARE 
     @SQL nvarchar(max),
     @full_table_name nvarchar(max) = CONCAT(@schema_name, N'.', @table_name);
    
     SELECT @SQL = COALESCE(@SQL + ', ', '') + QUOTENAME([Name])
     FROM sys.columns sc
     LEFT JOIN STRING_SPLIT(@list_of_columns_excluded, @separator) ss ON sc.[name] = ss.[value]
     WHERE sc.OBJECT_ID = OBJECT_ID(@full_table_name, N'u')
     AND ss.[value] IS NULL;
    
     SELECT @SQL = N'SELECT ' + @SQL + N' FROM ' + @full_table_name;
     EXEC(@SQL)
    END
    

    And then just:

    EXEC [usp_select_without] 
    @table_name = N'Test_Table',
    @list_of_columns_excluded = N'ID, Date, Name';
    
    0 讨论(0)
  • 2020-11-22 00:04

    Postgres sql has a way of doing it

    pls refer: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html

    The Information Schema Hack Way

    SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
            FROM information_schema.columns As c
                WHERE table_name = 'officepark' 
                AND  c.column_name NOT IN('officeparkid', 'contractor')
        ), ',') || ' FROM officepark As o' As sqlstmt
    

    The above for my particular example table - generates an sql statement that looks like this

    SELECT o.officepark,o.owner,o.squarefootage FROM officepark As o

    0 讨论(0)
  • 2020-11-22 00:04

    Well, it is a common best practice to specify which columns you want, instead of just specifying *. So you should just state which fields you want your select to return.

    0 讨论(0)
  • 2020-11-22 00:06

    If you don't want to write each column name manually you can use Script Table As by right clicking on table or view in SSMS like this:

    enter image description here

    Then you will get whole select query in New Query Editor Window then remove unwanted column like this:

    enter image description here

    Done

    0 讨论(0)
  • 2020-11-22 00:06

    If we are talking of Procedures, it works with this trick to generate a new query and EXECUTE IMMEDIATE it:

    SELECT LISTAGG((column_name), ', ') WITHIN GROUP (ORDER BY column_id)
    INTO var_list_of_columns
    FROM ALL_TAB_COLUMNS
    WHERE table_name = 'PUT_HERE_YOUR_TABLE'
    AND column_name NOT IN ('dont_want_this_column','neither_this_one','etc_column');
    
    0 讨论(0)
提交回复
热议问题