Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je obtenir les enregistrements de valeur NULL d'une table?

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

NULL les valeurs seront classées en premier.

Lors de la concaténation d'une valeur avec NULL le résultat est NULL donc First_Name+Last_Name sera NULL si l'un est NULL .

cast(Staff_ID as varchar(10))+... y a-t-il une garantie de la commande que vous souhaitez pour le cas où First_Name+Last_Name n'est pas NULL (Je suppose Staff_ID est int ).

Et le tri supplémentaire par colonne Staff_ID est là pour garantir l'ordre que vous souhaitez pour toutes les lignes où First_Name+Last_Name est NULL

Mettre à jour

Vous pouvez créer la requête dynamiquement à l'aide de INFORMATION_SCHEMA.COLUMNS. Cela pourrait faire ce que vous voulez. Notez que ceci n'est pas testé pour tous les types de types de données.

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)

Mise à jour 2

Une version non dynamique utilisant XML à la place.

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

Mise à jour 3

Si vous connaissez la clé primaire de votre table et que cela ne vous dérange pas de taper la clause where, vous pouvez l'utiliser au lieu d'utiliser 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')