Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso obter os registros com valor NULL de uma tabela?

select Staff_ID, First_Name, Last_Name
from YourTable
order by cast(Staff_ID as varchar(10))+First_Name+Last_Name,
         Staff_ID

NULL os valores serão ordenados primeiro.

Ao concatenar um valor com NULL o resultado é NULL então First_Name+Last_Name será NULL se algum for NULL .

cast(Staff_ID as varchar(10))+... há garantia do pedido que você deseja para o caso em que First_Name+Last_Name é não NULL (Presumo que Staff_ID é int ).

E a ordem extra por coluna Staff_ID existe para garantir a ordem desejada para todas as linhas em que First_Name+Last_Name é NULL

Atualizar

Você pode construir a consulta dinamicamente usando INFORMATION_SCHEMA.COLUMNS. Isso pode fazer o que você quer. Observe que isso não é testado para todos os tipos de dados.
declare @TableName sysname  = 'YourTable'
declare @Sql nvarchar(max) = 'select * from '+quotename(@TableName)+ ' order by '

select @Sql = @Sql+'+cast('+COLUMN_NAME+' as varchar(max))'
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName

exec (@Sql)

Atualização 2

Uma versão não dinâmica usando XML.
;with C as 
( 
  select *,
         row_number() over(order by (select 1)) as rn
  from YourTable
)
select C1.*
from C as C1
  cross apply (select *
               from C as C2
               where C1.rn = C2.rn
               for xml path('x'), type) as T(N)
order by T.N.value('count(/x/*)', 'int')

Atualização 3

Se você conhece a chave primária da sua tabela e não se importa em digitar a cláusula where, você pode usar isso em vez de usar row_number() .
select Y1.*
from YourTable as Y1
order by (select *
          from YourTable as Y2
          where Y1.Staff_ID = Y2.Staff_ID
          for xml path('x'), type).value('count(/x/*)', 'int')