Найти ненулевые столбцы в SQL Server в таблице - PullRequest
0 голосов
/ 25 апреля 2020

Я прочитал много ответов, но все они для PL / SQL или Oracle, я не смог найти ничего для Microsoft SQL -Server.

Моя таблица:

CREATE TABLE StudentScore
(
  Student_ID INT PRIMARY KEY,
  Student_Name NVARCHAR (50),
  Student_Score INT
) 

GO

INSERT INTO StudentScore VALUES (1,'Ali', NULL)
INSERT INTO StudentScore VALUES (2,'Zaid', 770)
INSERT INTO StudentScore VALUES (3,'Mohd', 1140)
INSERT INTO StudentScore VALUES (4,NULL, 770)
INSERT INTO StudentScore VALUES (5,'John', 1240)
INSERT INTO StudentScore VALUES (6,'Mike', 1140)
INSERT INTO StudentScore VALUES (7,'Goerge', NULL)
  1. Как найти имена всех ненулевых столбцов.
  2. Возвращать таблицу, содержащую только ненулевые столбцы

РЕДАКТИРОВАТЬ на основе комментариев:

Мне известен атрибут IS_NULLABLE Information_schema. Но то, что столбец допускает нулевые значения, не означает, что он будет иметь нулевые значения. Как найти столбцы, которые на самом деле имеют нулевые значения.

Я ищу num_nulls эквивалент для Microsoft SQL -SERVER.

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Этого можно достичь, введя:

SELECT 
  FORMATMESSAGE('SELECT col = ''%s.%s.%s'' FROM %s.%s HAVING COUNT(*) != COUNT(%s)', 
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME)
  )
FROM INFORMATION_SCHEMA.COLUMNS
WHERE IS_NULLABLE = 'YES';

db <> fiddle demo

Будет сгенерирован скрипт для проверки отдельного столбца .

HAVING COUNT(*) != COUNT(col_name) -- it means that column contains at least single NULL

HAVING COUNT(col_name) = 0 AND COUNT(*) != 0 -- it means all values in columns are NULL

Этот подход может быть отработан с использованием STRING_AGG для получения одного запроса на таблицу, а с помощью Dynami c SQL можно избежать необходимости копировать запрос.

РЕДАКТИРОВАТЬ:

Полностью запеченный раствор:

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = STRING_AGG(
  FORMATMESSAGE('SELECT table_schema = ''%s''
                        ,table_name = ''%s''
                        ,table_col_name = ''%s'' 
                        ,row_num = COUNT(*)
                        ,row_num_non_nulls = COUNT(%s)
                        ,row_num_nulls = COUNT(*) - COUNT(%s)
                 FROM %s.%s', 
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME)), ' UNION ALL' + CHAR(13)
               ) WITHIN GROUP(ORDER BY TABLE_SCHEMA, TABLE_NAME)

FROM INFORMATION_SCHEMA.COLUMNS
WHERE IS_NULLABLE = 'YES'
  AND TABLE_NAME = ?        -- filter by table name
  AND TABLE_SCHEMA = ?;     -- filter by schema name

SELECT @sql;
EXEC(@sql);

дБ <> Fiddle демо

Выход:

+---------------+-----------------+------------------+----------+--------------------+---------------+
| table_schema  |   table_name    | table_col_name   | row_num  | row_num_non_nulls  | row_num_nulls |
+---------------+-----------------+------------------+----------+--------------------+---------------+
| [dbo]         | [StudentScore]  | [Student_Name]   |       7  |                 6  |             1 |
| [dbo]         | [StudentScore]  | [Student_Score]  |       7  |                 5  |             2 |
+---------------+-----------------+------------------+----------+--------------------+---------------+    
1 голос
/ 25 апреля 2020

Возможно, вы хотите посмотреть на INFORMATION_SCHEMA.COLUMNS. Столбец IS_NULLABLE предоставляет эту информацию.

Обратите внимание, что таблицы INFORMATION_SCHEMA (ну, на самом деле они являются представлениями) являются стандартными SQL, поэтому эта информация доступна в большинстве баз данных. Oracle (еще?) Не принял их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...