SQL: Выберите столбцы с Нулевыми значениями только

Я знаю, что пользователь спросил об этом для Linux, но у меня была эта проблема в Windows (10 64 бит), и я нашел мало информации, поэтому я решил это:

  • Загрузить LIBAV , я использовал libav-11.3-win64.7z. Просто скопируйте «avprobe.exe» и все DLL-файлы из «/ win64 / usr / bin» в «youtube-dl.exe».

Если LIBAV не помогает, попробуйте FFMPEG , копируя содержимое папки «bin», где находится «youtube-dl.exe». Это не помогло мне, но другие сказали, что это так, поэтому стоит попробовать.

Надеюсь, это поможет кому-то, имеющему проблему в Windows.

48
задан ConcernedOfTunbridgeWells 8 October 2008 в 22:16
поделиться

10 ответов

Вот sql или более поздняя версия 2005 года: Замените ADDR_Address своим именем таблицы.

declare @col varchar(255), @cmd varchar(max)

DECLARE getinfo cursor for
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
WHERE t.Name = 'ADDR_Address'

OPEN getinfo

FETCH NEXT FROM getinfo into @col

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @cmd = 'IF NOT EXISTS (SELECT top 1 * FROM ADDR_Address WHERE [' + @col + '] IS NOT NULL) BEGIN print ''' + @col + ''' end'
    EXEC(@cmd)

    FETCH NEXT FROM getinfo into @col
END

CLOSE getinfo
DEALLOCATE getinfo
67
ответ дан Charles Graham 7 November 2019 в 22:22
поделиться

Здесь я создал сценарий для любого вида таблицы SQL. скопируйте эту хранимую процедуру и создайте это на Вашей Среде и выполните эту хранимую процедуру с Вашей Таблицей.

exec [dbo].[SP_RemoveNullValues] 'Your_Table_Name'

хранимая процедура

GO
/****** Object:  StoredProcedure [dbo].[SP_RemoveNullValues]    Script Date: 09/09/2019 11:26:53 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- akila liyanaarachchi
Create procedure [dbo].[SP_RemoveNullValues](@PTableName Varchar(50) ) as 
begin


DECLARE Cussor CURSOR FOR 
SELECT COLUMN_NAME,TABLE_NAME,DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @PTableName  

OPEN Cussor;

Declare @ColumnName Varchar(50)
Declare @TableName  Varchar(50)
Declare @DataType Varchar(50)
Declare @Flage  int 

FETCH NEXT FROM Cussor INTO @ColumnName,@TableName,@DataType
WHILE @@FETCH_STATUS = 0
BEGIN

set @Flage=0


If(@DataType in('bigint','numeric','bit','smallint','decimal','smallmoney','int','tinyint','money','float','real'))
begin
set @Flage=1
end 
If(@DataType in('date','atetimeoffset','datetime2','smalldatetime','datetime','time'))
begin
set @Flage=2
end 
If(@DataType in('char','varchar','text','nchar','nvarchar','ntext'))
begin
set @Flage=3
end 

If(@DataType in('binary','varbinary'))
begin
set @Flage=4
end 



DECLARE @SQL VARCHAR(MAX) 

if  (@Flage in(1,4))
begin 

SET @SQL ='  update ['+@TableName+'] set ['+@ColumnName+']=0 where ['+@ColumnName+'] is null'
end 

if  (@Flage =3)
begin 

SET @SQL ='  update ['+@TableName+'] set ['+@ColumnName+'] = '''' where ['+@ColumnName+'] is null '
end 

if  (@Flage =2)
begin 

SET @SQL ='  update ['+@TableName+'] set ['+@ColumnName+'] ='+'''1901-01-01 00:00:00.000'''+' where ['+@ColumnName+'] is null '
end 


EXEC(@SQL)



FETCH NEXT FROM Cussor INTO @ColumnName,@TableName,@DataType
END

CLOSE Cussor
DEALLOCATE Cussor

END
0
ответ дан 7 November 2019 в 12:22
поделиться
SELECT cols
FROM table
WHERE cols IS NULL
22
ответ дан Luv 7 November 2019 в 22:22
поделиться

Или Вы хотели просто видеть, имеет ли столбец только Нулевые значения (и, таким образом, вероятно, не использовано)?

Дальнейшее разъяснение вопроса могло бы помочь.

РЕДАКТИРОВАНИЕ: хорошо.. вот некоторый действительно грубый код для получения Вас движение...

SET NOCOUNT ON
DECLARE @TableName Varchar(100)
SET @TableName='YourTableName'
CREATE TABLE #NullColumns (ColumnName Varchar(100), OnlyNulls BIT)
INSERT INTO #NullColumns (ColumnName, OnlyNulls) SELECT c.name, 0 FROM syscolumns c INNER JOIN sysobjects o ON c.id = o.id AND o.name = @TableName AND o.xtype = 'U'
DECLARE @DynamicSQL AS Nvarchar(2000)
DECLARE @ColumnName Varchar(100)
DECLARE @RC INT
    SELECT TOP 1 @ColumnName = ColumnName FROM #NullColumns WHERE OnlyNulls=0
    WHILE @@ROWCOUNT > 0
    BEGIN
        SET @RC=0
        SET @DynamicSQL = 'SELECT TOP 1 1 As HasNonNulls FROM ' + @TableName + ' (nolock) WHERE ''' + @ColumnName + ''' IS NOT NULL'
        EXEC sp_executesql @DynamicSQL
        set @RC=@@rowcount
        IF @RC=1
        BEGIN
            SET @DynamicSQL = 'UPDATE #NullColumns SET OnlyNulls=1 WHERE ColumnName=''' + @ColumnName + ''''
            EXEC sp_executesql @DynamicSQL
        END
        ELSE
        BEGIN
            SET @DynamicSQL = 'DELETE FROM #NullColumns WHERE ColumnName=''' + @ColumnName+ ''''
            EXEC sp_executesql @DynamicSQL
        END
    SELECT TOP 1 @ColumnName = ColumnName FROM #NullColumns WHERE OnlyNulls=0
    END

SELECT * FROM #NullColumns

DROP TABLE #NullColumns
SET NOCOUNT OFF

Да, существуют более легкие пути, но у меня есть встреча для движения в прямо сейчас.Удачи!

4
ответ дан Kevin Fairchild 7 November 2019 в 22:22
поделиться

Можно сделать:

select 
  count(<columnName>)
from
  <tableName>

, Если количество возвращается 0, который означает, что все строки в том столбце весь ПУСТОЙ УКАЗАТЕЛЬ (или нет никаких строк вообще в таблице)

может быть изменен на

select 
    case(count(<columnName>)) when 0 then 'Nulls Only' else 'Some Values' end
from 
    <tableName>

, Если Вы хотите автоматизировать его, можно использовать системные таблицы для итерации имен столбцов в таблице, Вы интересуетесь

2
ответ дан kristof 7 November 2019 в 22:22
поделиться

Это должно дать Вам список всех столбцов в таблице "Person", которая имеет только Нулевые значения. Вы получите результаты как несколько наборов результатов, которые или пусты, или содержит название отдельного столбца. Необходимо заменить "Человека" в двух местах для использования его с другой таблицей.

DECLARE crs CURSOR LOCAL FAST_FORWARD FOR SELECT name FROM syscolumns WHERE id=OBJECT_ID('Person')
OPEN crs
DECLARE @name sysname
FETCH NEXT FROM crs INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC('SELECT ''' + @name + ''' WHERE NOT EXISTS (SELECT * FROM Person WHERE ' + @name + ' IS NOT NULL)')
    FETCH NEXT FROM crs INTO @name
END
CLOSE crs
DEALLOCATE crs
6
ответ дан MobyDX 7 November 2019 в 22:22
поделиться

Я также рекомендовал бы искать поля, которые у всех есть то же значение, не просто ПУСТОЙ УКАЗАТЕЛЬ.

таким образом, для каждого столбца в каждой таблице делают запрос:

SELECT COUNT(DISTINCT field) FROM tableName

и концентрат на тех, которые возвращаются 1 в результате.

1
ответ дан squadette 7 November 2019 в 22:22
поделиться

Необходимо будет циклично выполниться по набору столбцов и проверить каждого. Необходимо быть в состоянии получить список всех столбцов с командой таблицы DESCRIBE.

Псевдокод:


foreach $column ($cols) {
   query("SELECT count(*) FROM table WHERE $column IS NOT NULL")
   if($result is zero)  {
      # $column contains only null values"
      push @onlyNullColumns, $column;
   } else {
      # $column contains non-null values
   }
}
return @onlyNullColumns;

я знаю, что это кажется немного парадоксальным, но SQL не обеспечивает собственный метод выбора столбцов, только строки.

0
ответ дан Daniel Papasian 7 November 2019 в 22:22
поделиться

Если необходимо перечислить все строки, где все значения столбцов NULL, то я использовал бы эти COLLATE функция. Это берет список значений и возвращает первое ненулевое значение. Если Вы добавляете все имена столбцов к списку, то используйте IS NULL, необходимо добраться, все строки, содержащие только, аннулирует.

SELECT * FROM MyTable WHERE COLLATE(Col1, Col2, Col3, Col4......) IS NULL

у Вас не должно действительно быть таблиц с ВЕСЬ columns пустой указатель, поскольку это означает, что Вы не имеете primary key (не позволенный быть null). Не наличие первичного ключа является чем-то, чтобы избежаться; это повреждает первую нормальную форму.

1
ответ дан Gonzalo.- 7 November 2019 в 22:22
поделиться

Вы, возможно, должны были бы разъясниться немного. Что Вы действительно пытаетесь выполнить? Если Вы действительно хотите узнать имена столбцов, которые только содержат нулевые значения, то необходимо будет циклично выполниться через scheama и сделать динамический запрос на основе этого.

я не знаю, какой DBMS Вы используете, таким образом, я помещу некоторый псевдокод здесь.

for each col
begin
  @cmd = 'if not exists (select * from tablename where ' + col + ' is not null begin print ' + col + ' end'
exec(@cmd)
end
-1
ответ дан Charles Graham 7 November 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: