sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo obtener los registros con valor NULL de una tabla?

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

NULL los valores se ordenarán primero.

Al concatenar un valor con NULL el resultado es NULL entonces First_Name+Last_Name será NULL si alguno es NULL .

cast(Staff_ID as varchar(10))+... hay garantía del orden que desea para el caso cuando First_Name+Last_Name es no NULL (Supongo que Staff_ID es int ).

Y el pedido extra por columna Staff_ID está ahí para garantizar el orden que desea para todas las filas donde First_Name+Last_Name es NULL

Actualizar

Puede crear la consulta de forma dinámica utilizando INFORMACION_ESQUEMA.COLUMNAS. Esto podría hacer lo que quieras. Tenga en cuenta que esto no se prueba para todo tipo de tipos de datos.

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)

Actualización 2

Una versión no dinámica que usa XML en su lugar.

;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')

Actualización 3

Si conoce la clave principal de su tabla y no le importa escribir la cláusula where, puede usar esto en lugar 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')