Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich die Datensätze mit NULL-Wert aus einer Tabelle abrufen?

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

NULL Werte werden zuerst geordnet.

Beim Verketten eines Werts mit NULL das Ergebnis ist NULL also First_Name+Last_Name wird NULL sein falls einer NULL ist .

cast(Staff_ID as varchar(10))+... Gibt es eine Garantie für die gewünschte Reihenfolge für den Fall, wenn First_Name+Last_Name ist nicht NULL (Ich nehme an Staff_ID ist int ).

Und die zusätzliche Sortierung nach Spalte Staff_ID dient dazu, die gewünschte Reihenfolge für alle Zeilen mit First_Name+Last_Name zu garantieren ist NULL

Aktualisieren

Sie können die Abfrage mithilfe von INFORMATION_SCHEMA.COLUMNS dynamisch erstellen. Dies könnte tun, was Sie wollen. Beachten Sie, dass dies nicht für alle Arten von Datentypen getestet wurde.

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)

Aktualisierung 2

Eine nicht dynamische Version, die stattdessen XML verwendet.

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

Aktualisierung 3

Wenn Sie den Primärschlüssel Ihrer Tabelle kennen und es Ihnen nichts ausmacht, die where-Klausel einzugeben, können Sie diese anstelle von row_number() verwenden .

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