sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag få NULL-värderade poster från en tabell?

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

NULL värden kommer att beställas först.

När du sammanfogar ett värde med NULL resultatet är NULLFirst_Name+Last_Name kommer att vara NULL om någon är NULL .

cast(Staff_ID as varchar(10))+... finns det garanti för den ordning du vill ha för ärendet när First_Name+Last_Name är inte NULL (Jag antar Staff_ID är int ).

Och den extra ordningen efter kolumn Staff_ID finns det för att garantera den ordning du vill ha för alla rader där First_Name+Last_Name är NULL

Uppdatera

Du kan skapa frågan dynamiskt med INFORMATION_SCHEMA.COLUMNS. Detta kan göra vad du vill. Observera att detta inte testas för alla typer av datatyper.

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)

Uppdatering 2

En icke-dynamisk version som använder XML istället.

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

Uppdatering 3

Om du känner till din tabells primärnyckel och inte har något emot att skriva where-satsen kan du använda denna istället för att använda 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')


  1. Konvertera datum i formatet MM/DD/ÅÅÅÅ till MySQL-datum

  2. Hur påverkar lagringsbackend Datomic?

  3. Varför fungerar inte CROSS JOIN-villkoren i 'ON'-klausulen, bara WHERE-satsen?

  4. Gäller gränsen för det maximala antalet SQL-join-tabeller för hela frågan, eller räknas underfrågor separat?