Выбрать из таблицы только те столбцы, которые не пусты? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть таблица с сотнями столбцов:

------------------------------------------------
ID    ColA    ColB    ColC  Col D   ...   ColZZZ
------------------------------------------------
1             bla
2     foo
3     bar
4                                         baz
------------------------------------------------

Мне нужно знать, в каких столбцах нет значений (то есть: которые пусты '' не NULL)

Я мог бы создать запрос для каждого столбца:

select count(1) from [table] where [ColA] <> ''; -- returns 2, so not, not empty
select count(1) from [table] where [ColB] <> ''; -- returns 1, so no
select count(1) from [table] where [ColC] <> ''; -- returns 0, so yay! found and empty one
...
etc

Но должен быть более простой способ для этого?

Есть ли способ вернуть [table] без пустого столбцы, другими словами:

----------------------------
ID    ColA    ColB    ColZZZ
----------------------------
1             bla
2     foo
3     bar
4                     baz
----------------------------

Ответы [ 2 ]

1 голос
/ 16 марта 2020

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

Вы создаете временную таблицу для хранения имен столбцов, которые не являются пустыми, и используете курсор для создания динамических c sql для их поиска.

В конце просто сгенерируйте другую динамику c sql, чтобы выбрать столбцы на основе результатов временной таблицы.

IF (OBJECT_ID('tempdb..#tmpRez') IS NOT NULL) DROP TABLE #tmpRez;
CREATE TABLE #tmpRez (TableName sysname, ColName sysname);

DECLARE crs CURSOR LOCAL FAST_FORWARD FOR
    SELECT t.name, c.name FROM sys.tables t
    INNER JOIN  sys.columns c ON c.object_id=t.object_id
    WHERE 1=1
    AND t.name = 'Table1' -- OR your own condition

OPEN crs;

DECLARE @tbl sysname;
DECLARE @col sysname;
DECLARE @sql NVARCHAR(MAX);

FETCH NEXT FROM crs INTO @tbl,@col;

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @sql = 'IF EXISTS (SELECT * FROM ['+ @tbl+'] WHERE [' + @col + '] <> '''') INSERT INTO #tmpRez SELECT ''' + @tbl +''','''+ @col + '''';
    EXEC(@sql);
    FETCH NEXT FROM crs INTO @tbl,@col;
END;

CLOSE crs;
DEALLOCATE crs;   

SELECT @sql = 'SELECT ' + STUFF((SELECT ',' + ColName FROM #tmpRez x
            where x.TableName = y.TableName
    FOR XML PATH ('')), 1, 1, '')  + ' FROM ' + TableName 
FROM #tmpRez y GROUP BY TableName   

EXEC (@sql)
0 голосов
/ 16 марта 2020

Как насчет того, чтобы вернуть таблицу без пустых столбцов:

SELECT * from table 
WHERE column IS NOT NULL AND TRIM(column) <> ''

Это чтобы вернуть таблицу с пустыми столбцами:

SELECT * from table 
WHERE column IS NULL AND TRIM(column) = ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...