sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu získat záznamy s hodnotou NULL z tabulky?

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

NULL hodnoty budou objednány jako první.

Při zřetězení hodnoty pomocí NULL výsledkem je NULL tedy First_Name+Last_Name bude NULL pokud je některá NULL .

cast(Staff_ID as varchar(10))+... existuje záruka požadovaného pořadí pro případ, kdy First_Name+Last_Name není NULL (Předpokládám, že Staff_ID je int ).

A další objednávka podle sloupce Staff_ID je zde pro zaručení požadovaného pořadí pro všechny řádky, kde je First_Name+Last_Name je NULL

Aktualizovat

Dotaz můžete sestavit dynamicky pomocí INFORMATION_SCHEMA.COLUMNS. To může dělat, co chcete. Poznámka, toto není testováno pro všechny druhy datových typů.

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)

Aktualizace 2

Nedynamická verze využívající místo toho 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')

Aktualizace 3

Pokud znáte primární klíč své tabulky a nevadí vám zadat klauzuli where, můžete ji použít namísto použití 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. 5 praktických tipů k databázi pro začátečníky

  2. SQL Natural Join

  3. mysql, jaká je správná syntaxe tohoto příkazu podmíněné aktualizace

  4. Spouštěče SQL Server – Část 2 Spouštěče DDL &LOGON