sql >> データベース >  >> RDS >> Sqlserver

SQL Server:レコードの値に基づいて列名を返します

    Cross applyを使用することもできます

    SELECT Cname
    FROM   Tablename
           CROSS apply (VALUES('Field1',Field1),
                              ('Field2',Field2),
                              ('Field3',Field3),
                              ('Field4',Field4)) ca (cname, data)
    WHERE  data = 1 
    

    動的に作業するには、これを使用します。

    CREATE TABLE test
      (
         Field1 INT,
         Field2 INT,
         Field3 INT,
         Field4 INT
      )
    
    INSERT INTO test
    VALUES      ( 1,0,0,1 )
    
    DECLARE @collist VARCHAR(max)='',
            @sql     NVARCHAR(max)
    
    SELECT @collist += '(''' + COLUMN_NAME + ''',' + COLUMN_NAME + '),'
    FROM   INFORMATION_SCHEMA.columns
    WHERE  TABLE_NAME = 'test'
           AND COLUMN_NAME LIKE 'Field%'
           AND TABLE_SCHEMA = 'dbo'
    
    SELECT @collist = LEFT(@collist, Len(@collist) - 1)
    
    SET @sql ='
    SELECT Cname
    FROM   test
           CROSS apply (VALUES' + @collist
              + ') ca (cname, data)
    WHERE  data = 1 '
    
    EXEC Sp_executesql
      @sql 
    


    1. Oracleでのインデックスの使用を強制する

    2. PreparedStatementと大文字と小文字を区別しない検索の使用方法

    3. ライブラリデータモデル

    4. 非常に大きなセットのSQLAlchemyセットメンバーシップ