복붙노트

[SQL] EXCEPT SELECT *

SQL

EXCEPT SELECT *

SELECT와 같은 구현 뭔가 * 다만 본 RDBMS가 있습니까? 나는 후 특정 텍스트 / BLOB 필드를 제외한 모든 필드를 받고있어, 난 그냥 다른 모든를 선택하고 싶습니다 무엇.

거의 매일 누군가가이를 구현해야한다는 나의 동료에게 불평 ... 그것은 존재하지 않는 정말 짜증나.

편집 : SELECT *에 대한 모든 사람의 우려를 이해합니다. 나는 선택과 관련된 위험을 알고 *. 그러나,이는, 내 상황에서 적어도 어떤 생산 수준 코드, 또는 개발 수준 코드에 사용되지 않을 것이다; 엄격하게 내가 쉽게 모든 값을 참조 할 때, 디버깅.

내가 일하는 의견의 일부에서 언급했듯이 ssh를 통해 최선을 다하고, 엄격하게 명령 줄 가게입니다. 이것은 어려운 어떤 GUI 도구 (허용되지 않는 데이터베이스에 대한 외부 연결), 등 등을 사용 할 수 있습니다

비록 제안을 주셔서 감사합니다.

해결법

  1. ==============================

    1.다른 사람이 말했듯이, 누군가가 미래에 테이블 구조가 변경 될 때이 문제에 대한 경향이 있기 때문에 쿼리에서이 작업을 수행 할 수있는 좋은 생각이 아니다. 그러나,이 작업을 수행하는 방법입니다 ... 그리고 난 사실이 있음을 시사하지만, 실제 질문에 대답의 정신에있어 믿을 수 없어 ...

    다른 사람이 말했듯이, 누군가가 미래에 테이블 구조가 변경 될 때이 문제에 대한 경향이 있기 때문에 쿼리에서이 작업을 수행 할 수있는 좋은 생각이 아니다. 그러나,이 작업을 수행하는 방법입니다 ... 그리고 난 사실이 있음을 시사하지만, 실제 질문에 대답의 정신에있어 믿을 수 없어 ...

    동적 SQL 함께 할 ...이 "설명"열을 제외한 모든 열을 수행합니다. 당신은 쉽게 함수 또는 저장 프로 시저에이를 돌 수 있었다.

    declare @sql varchar(8000),
        @table_id int,
        @col_id int
    
    set @sql = 'select '
    
    select @table_id = id from sysobjects where name = 'MY_Table'
    
    select @col_id = min(colid) from syscolumns where id = @table_id and name <> 'description'
    while (@col_id is not null) begin
        select @sql = @sql + name from syscolumns where id = @table_id and colid = @col_id
    
        select @col_id = min(colid) from syscolumns where id = @table_id and colid > @col_id and name <> 'description'
        if (@col_id is not null) set @sql = @sql + ','
        print @sql
    end
    
    set @sql = @sql + ' from MY_table'
    
    exec @sql
    
  2. ==============================

    2.블롭 열을 포함하지 않는 테이블에보기를 만듭니다

    블롭 열을 포함하지 않는 테이블에보기를 만듭니다

  3. ==============================

    3.예, 구글 빅 쿼리 구현 *이 EXCEPT 선택

    예, 구글 빅 쿼리 구현 *이 EXCEPT 선택

    WITH orders AS(
      SELECT 5 as order_id,
      "sprocket" as item_name,
      200 as quantity
    )
    SELECT * EXCEPT (order_id)
    FROM orders;
    

    산출:

    +-----------+----------+
    | item_name | quantity |
    +-----------+----------+
    | sprocket  | 200      |
    +-----------+----------+
    

    편집하다:

    H2 데이터베이스는 SELECT * EXCEPT (COL1, COL2, ...) 구문을 지원합니다.

    편집 2 :

    하이브 지원 : REGEX 열 사양

    SELECT `(ds|hr)?+.+` FROM sales
    
  4. ==============================

    4.DB2이 가능합니다. 열 숨겨진의 속성 / 지정자를 가지고있다.

    DB2이 가능합니다. 열 숨겨진의 속성 / 지정자를 가지고있다.

    SYSCOLUMNS 문서에서

    당신의 열을 만들기의 일환으로 테이블 문서를 작성, 당신은 내재적으로 숨겨진 수정을 지정합니다

    내재적으로 숨겨진 열에서 예제 DDL은 다음과

    CREATE TABLE T1
    (C1 SMALLINT NOT NULL,
    C2 CHAR(10) IMPLICITLY HIDDEN,
    C3 TIMESTAMP)
    IN DB.TS;
    

    이 기능 여부 DB2의 도입은 미래의 독자들에게 연습 문제로 남겨 운전하는 등 거래 업체입니다.

  5. ==============================

    5.예! 진정으로 관계형 언어 튜토리얼 D 투사가 속성으로 표현 할 수 있습니다 예를 들어, 유지하는 것 대신에 제거 할 수

    예! 진정으로 관계형 언어 튜토리얼 D 투사가 속성으로 표현 할 수 있습니다 예를 들어, 유지하는 것 대신에 제거 할 수

    my_relvar { ALL BUT description }
    

    사실, SQL의 SELECT에 대한 동등한은 * {ALL하지만}입니다.

    SQL에 대한 귀하의 제안은 가치있는 일입니다하지만 난 이미 공급 업체의 그룹에 의해 사용자의 그룹에 의해 SQL 표준위원회에 넣고 거부되었습니다 들었다 :(

    또한 명시 적으로 SQL Server에 대한 요청 되었으나 요청은 '해결되지 않습니다'로 폐쇄되었다.

  6. ==============================

    6.네, 마지막으로이 : SQL 표준 2016 명을 정의 다형성 테이블 함수

    네, 마지막으로이 : SQL 표준 2016 명을 정의 다형성 테이블 함수

    오라클 18C는이 메커니즘을 구현합니다. 18C Skip_col 다형성 표 기능 예 오라클 라이브 SQL 및 Skip_col 다형성 표 함수 예제

    이름 / 특정 데이터 형식에 따라 데이터를 생략하는 방법이 예를 보여줍니다 :

    CREATE PACKAGE skip_col_pkg AS  
      -- OVERLOAD 1: Skip by name 
      FUNCTION skip_col(tab TABLE,  col columns)  
               RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;  
    
      FUNCTION describe(tab IN OUT dbms_tf.table_t,   
                        col        dbms_tf.columns_t)  
               RETURN dbms_tf.describe_t;  
    
      -- OVERLOAD 2: Skip by type --  
      FUNCTION skip_col(tab       TABLE,   
                        type_name VARCHAR2,  
                        flip      VARCHAR2 DEFAULT 'False')   
               RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;  
    
      FUNCTION describe(tab       IN OUT dbms_tf.table_t,   
                        type_name        VARCHAR2,   
                        flip             VARCHAR2 DEFAULT 'False')   
               RETURN dbms_tf.describe_t;  
    END skip_col_pkg;
    

    몸과 :

    CREATE PACKAGE BODY skip_col_pkg AS  
    
    /* OVERLOAD 1: Skip by name   
     * NAME:  skip_col_pkg.skip_col   
     * ALIAS: skip_col_by_name  
     *  
     * PARAMETERS:  
     * tab - The input table  
     * col - The name of the columns to drop from the output  
     *  
     * DESCRIPTION:  
     *   This PTF removes all the input columns listed in col from the output  
     *   of the PTF.  
    */   
      FUNCTION  describe(tab IN OUT dbms_tf.table_t,   
                         col        dbms_tf.columns_t)  
                RETURN dbms_tf.describe_t  
      AS   
        new_cols dbms_tf.columns_new_t;  
        col_id   PLS_INTEGER := 1;  
      BEGIN   
        FOR i IN 1 .. tab.column.count() LOOP  
          FOR j IN 1 .. col.count() LOOP  
          tab.column(i).pass_through := tab.column(i).description.name != col(j);  
            EXIT WHEN NOT tab.column(i).pass_through;  
          END LOOP;  
        END LOOP;  
    
        RETURN NULL;  
      END;  
    
     /* OVERLOAD 2: Skip by type  
     * NAME:  skip_col_pkg.skip_col   
     * ALIAS: skip_col_by_type  
     *  
     * PARAMETERS:  
     *   tab       - Input table  
     *   type_name - A string representing the type of columns to skip  
     *   flip      - 'False' [default] => Match columns with given type_name  
     *               otherwise         => Ignore columns with given type_name  
     *  
     * DESCRIPTION:  
     *   This PTF removes the given type of columns from the given table.   
    */   
    
      FUNCTION describe(tab       IN OUT dbms_tf.table_t,   
                        type_name        VARCHAR2,   
                        flip             VARCHAR2 DEFAULT 'False')   
               RETURN dbms_tf.describe_t   
      AS   
        typ CONSTANT VARCHAR2(1024) := upper(trim(type_name));  
      BEGIN   
        FOR i IN 1 .. tab.column.count() LOOP  
           tab.column(i).pass_through :=   
             CASE upper(substr(flip,1,1))  
               WHEN 'F' THEN dbms_tf.column_type_name(tab.column(i).description)
         !=typ  
               ELSE          dbms_tf.column_type_name(tab.column(i).description) 
         =typ  
             END /* case */;  
        END LOOP;  
    
        RETURN NULL;  
      END;  
    
    END skip_col_pkg;  
    

    그리고 샘플 사용 :

    -- skip number cols
    SELECT * FROM skip_col_pkg.skip_col(scott.dept, 'number'); 
    
    -- only number cols
    SELECT * FROM skip_col_pkg.skip_col(scott.dept, 'number', flip => 'True') 
    
    -- skip defined columns
    SELECT *   
    FROM skip_col_pkg.skip_col(scott.emp, columns(comm, hiredate, mgr))  
    WHERE deptno = 20;
    

    내가보기 엔 (대신 패키지 통화의 독립 기능을 생성하는) 전체 예를 읽을 것을 권장합니다.

    당신은 쉽게 예를 들어 방법을 건너 뛸 과부하 수 : 시작되지 않는 열 / 접두사 / 접미사 특정과 끝을 건너 뜁니다.

    DB <> Fidde 데모

    관련 : 어떻게 동적으로 변경할 수있는 SQL 쿼리에 의해 크리스 색슨의 열은

  7. ==============================

    7.SELECT * 멀리, 당신은 문제가 자신을 설정하고 있습니다. 항상 당신이 원하는 열을 정확하게 지정합니다. 그것은 매우 당신이 요구하는 "기능"이 존재하지 않는 상쾌한 사실이다.

    SELECT * 멀리, 당신은 문제가 자신을 설정하고 있습니다. 항상 당신이 원하는 열을 정확하게 지정합니다. 그것은 매우 당신이 요구하는 "기능"이 존재하지 않는 상쾌한 사실이다.

  8. ==============================

    8.누군가가 더 많은 커플을 추가하는 경우 - 나는 그것이 존재하지 않는에 대한 이론적 근거는 쿼리의 저자 (성능을 위해) 그들 만이에 / 필요 찾아봐야 (따라서 지정하는 것을 열) 알고있는 것을 요청해야한다고 믿습니다 모양 미래에, 당신은 다시 당신이 필요로하지 않을거야 가능성이 큰 분야를 당겨 할 것입니다.

    누군가가 더 많은 커플을 추가하는 경우 - 나는 그것이 존재하지 않는에 대한 이론적 근거는 쿼리의 저자 (성능을 위해) 그들 만이에 / 필요 찾아봐야 (따라서 지정하는 것을 열) 알고있는 것을 요청해야한다고 믿습니다 모양 미래에, 당신은 다시 당신이 필요로하지 않을거야 가능성이 큰 분야를 당겨 할 것입니다.

  9. ==============================

    9.다른 사람이 말하는대로 : SELECT * 나쁜 생각입니다.

    다른 사람이 말하는대로 : SELECT * 나쁜 생각입니다.

    몇 가지 이유 :

  10. ==============================

    10.

    declare @sql nvarchar(max)
            @table char(10)
    set @sql = 'select '
    set @table = 'table_name'
    
    SELECT @sql = @sql + '[' + COLUMN_NAME + '],'
    FROM   INFORMATION_SCHEMA.Columns
    WHERE  TABLE_NAME = @table
       and COLUMN_NAME <> 'omitted_column_name'
    SET    @sql = substring(@sql,1,len(@sql)-1) + ' from ' + @table
    
    EXEC (@sql);
    
  11. ==============================

    11.내가 @Glen이 HASHBYTES으로 내 인생을 완화 요청 어떤 식으로 뭔가를 필요로 ().

    내가 @Glen이 HASHBYTES으로 내 인생을 완화 요청 어떤 식으로 뭔가를 필요로 ().

    내 영감 @Jasmine 및 @Zerubbabel 답변했다. 같은 테이블 이름을 더는 sys.objects에서 두 번 이상 나타납니다 그래서 내 경우에는 내가, 다른 스키마를했습니다. 이 같은 시나리오 사람을 도움이 될 수로, 여기 간다 :

    ALTER PROCEDURE [dbo].[_getLineExceptCol]
    
    @table SYSNAME,
    @schema SYSNAME,
    @LineId int,
    @exception VARCHAR(500)
    
    AS
    
    DECLARE @SQL NVARCHAR(MAX)
    
    BEGIN
    
    SET NOCOUNT ON;
    
    SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name 
    FROM sys.columns 
    WHERE name <> @exception 
    AND object_id = (SELECT object_id FROM sys.objects 
                     WHERE name LIKE @table 
                     AND schema_id = (SELECT schema_id FROM sys.schemas WHERE name LIKE @schema))   
    
    SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @schema + '.' + @table + ' WHERE Id = ' + CAST(@LineId AS nvarchar(50))
    
    EXEC(@SQL)
    END
    GO
    
  12. ==============================

    12.임시 테이블 옵션은 여기, 바로 필요하지 않은 열을 삭제하고 변경된 임시 테이블에서 *를 선택합니다.

    임시 테이블 옵션은 여기, 바로 필요하지 않은 열을 삭제하고 변경된 임시 테이블에서 *를 선택합니다.

    /* Get the data into a temp table */
        SELECT * INTO #TempTable
        FROM 
        table
    
    /* Drop the columns that are not needed */
        ALTER TABLE #TempTable
        DROP COLUMN [columnname]
    
    SELECT * from #TempTable
    
  13. ==============================

    13.완성도를 위해,이 같은 일을하고, DremelSQL 방언 가능하다 :

    완성도를 위해,이 같은 일을하고, DremelSQL 방언 가능하다 :

    함께 주문 AS   (5 ORDER_ID 같은 SELECT   ITEM_NAME의로 "foobar12"   수량 800) SELECT 제외 * (ORDER_ID) 주문 FROM;

    + ----------- + ---------- + | ITEM_NAME의 | 수량 | + ----------- + ---------- + | foobar12 | 800 | + ----------- + ---------- +

    또한 드레 멜없이 여기 그것을 할 다른 방법이있는 것 같습니다.

  14. ==============================

    14.그것은 오래된 질문이지만, 나는이 대답은 여전히 ​​다른 사람에게 도움이 될 수 있기를 바랍니다. 또한 필드를 제외하고 하나 이상의 추가 수정할 수 있습니다. 당신이 많은 열이있는 테이블을 피벗 해제하려는 경우에 매우 유용 할 수 있습니다.

    그것은 오래된 질문이지만, 나는이 대답은 여전히 ​​다른 사람에게 도움이 될 수 있기를 바랍니다. 또한 필드를 제외하고 하나 이상의 추가 수정할 수 있습니다. 당신이 많은 열이있는 테이블을 피벗 해제하려는 경우에 매우 유용 할 수 있습니다.

    DECLARE @SQL NVARCHAR(MAX)
    SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name FROM sys.columns WHERE name <> 'colName' AND object_id = (SELECT id FROM sysobjects WHERE name = 'tblName')
    SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + 'tblName'
    EXEC sp_executesql  @SQL
    

    저장 프로 시저 :

    usp_SelectAllExcept 'TABLENAME', '열'

    ALTER PROCEDURE [dbo].[usp_SelectAllExcept]
    (
      @tblName SYSNAME
     ,@exception VARCHAR(500)
    )
    AS
    
    DECLARE @SQL NVARCHAR(MAX)
    
    SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name from sys.columns where name <> @exception and object_id = (Select id from sysobjects where name = @tblName)
    SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @tblName
    
    EXEC sp_executesql @SQL
    
  15. from https://stackoverflow.com/questions/413819/select-except by cc-by-sa and MIT license