sql-запрос для исключения не пустых столбцов

#sql #sql-server #sql-server-2012 #null

Вопрос:

У меня есть таблица ниже и записи

 create table emp_details(empno int primary key,enname varchar(22),sal int,comm int);
insert into emp_details values(1,'ram',4500,200);
insert into emp_details(empno,enname) values(2,'kumar');
insert into emp_details(empno)values(3);
 

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

 Excepted output

Empno     Ename         Sal   Comm
1         ram           4500  200
2         kumar 

  
 

Я использовал приведенный ниже запрос, чтобы получить вышеуказанный результат.

 select * from emp_details where empno  not in(select empno from emp_details
where enname is  null and sal is  null and comm is  null)
 

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

/

Комментарии:

1. Вы пытаетесь найти способ определить, что все 72 столбца являются пустыми, но без ввода всех 72 имен столбцов?

2. Я бы задался вопросом, почему у вас есть таблица, в которой все 71 столбец определены как NULL способные (за исключением ПК, который на самом деле не считается).

Ответ №1:

Вы можете проверить длину CONCAT этого способа (но он обрабатывает пустые строки и то же самое значение NULL):

 SELECT * FROM dbo.emp_details
  WHERE LEN(CONCAT(Sal,Comm,...70 more columns)) > 0;
 

Вы могли бы создать этот CONCAT список с помощью динамического SQL:

 DECLARE @sql nvarchar(max), @cols nvarchar(max);

SELECT @cols = STUFF((SELECT N','   name FROM sys.columns
  WHERE [object_id] = OBJECT_ID(N'dbo.emp_details')
    AND name NOT IN (N'empno', N'enname')
    ORDER BY column_id
  FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(max)'),1,1,N'');
  
SET @sql = N'SELECT empno, enname, '   @cols
    ' FROM dbo.emp_details WHERE LEN(CONCAT('   @cols   ')) > 0;';
  
EXEC sys.sp_executesql @sql;