sql >> データベース >  >> RDS >> Sqlserver

テーブルから NULL 値のレコードを取得するにはどうすればよいですか?

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

    NULL 値が最初に並べられます。

    NULL で値を連結する場合 結果は NULL です だから First_Name+Last_Name NULL になります いずれかが NULL の場合 .

    cast(Staff_ID as varchar(10))+... First_Name+Last_Name の場合に必要な順序が保証されていますか? そうではない NULL (私は Staff_ID を想定しています int です ).

    そして列 Staff_ID による余分な順序 First_Name+Last_Name のすべての行に対して必要な順序を保証するためにありますか NULL

    更新

    INFORMATION_SCHEMA.COLUMNS を使用して動的にクエリを作成できます。これはあなたが望むことをするかもしれません。これは、すべての種類のデータ型に対してテストされているわけではないことに注意してください。

    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)
      

    アップデート 2

    代わりに 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')
      

    アップデート 3

    テーブルの主キーが分かっていて、where 句を入力してもかまわない場合は、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. このセッションではcurrvalがまだ定義されていませんが、マルチセッションシーケンスを取得するにはどうすればよいですか?

    2. Zend-frameworkを使用してjoinで更新する

    3. SQL 2008でDECIMAL(14,3)を小数点以下第3位に切り捨てます

    4. MySql Doctrine:指定された変数がIN配列プロパティであるかどうかを確認します