web-dev-qa-db-ja.com

下部にヌルがあるORDER BY ASC

学校のテーブルを学区のテーブルに接続するSQLクエリを書いています。各学校が1つの地区に関連付けられている単純な1対多の関係。私のクエリは次のとおりです:

SELECT 
    schools.id AS schoolid,
    schools.name AS school, 
    districts.id AS districtid, 
    districts.name AS district
FROM sms_schools AS schools
    LEFT JOIN sms_districts AS districts ON schools.districtid = districts.id
WHERE 1 = 1
ORDER BY districts.name, schools.name

左加入をした理由は、すべての学校が地区に所属しているわけではないためです。たとえば、1つの学校がホームスクーリングであり、ホームスクーリングされているすべての生徒を含む場合があります。それは地区にはありません。

それで、私がしたいことは、ORDER BYを使用して、地区名と学校名の順に並べ替えることです。唯一の問題は、出力の最後に「その他」というグループを使用できるように、ヌルディストリクトを一番下にしたいことです。

出力の最後にnullを付けて昇順に並べることはできますか?

38
Dave Long

質問してからわずか1分で答えが見つかりました。 order by句の使用例では、nullを他よりも高い値にしています。

 ORDER BY (CASE WHEN districts.id IS NULL then 1 ELSE 0 END),districts.name, schools.name;
38
Dave Long

ISNULL()関数を使用できます。

MySQLマニュアルから:

ISNULL(expr

exprNULLの場合、ISNULL()は_1_を返し、それ以外の場合は_0_を返します。

_ORDER BY ISNULL(districts.name), districts.name, schools.name
_

MySQLのCASEオプションの代わりにこれを使用したい。 ISNULL()は標準SQLではなく、他のバージョンのSQLでは機能が異なるため、移植性がないことに注意してください。

25
toxalot

デフォルトではヌルが上部に表示されますが、IsNullを使用してデフォルト値を割り当てることができ、必要な位置に配置されます...


SELECT schools.id AS schoolid,schools.name AS school, districts.id AS districtid, districts.name AS district FROM sms_schools AS schools LEFT JOIN sms_districts AS districts ON schools.districtid = districts.id WHERE 1 = 1 
ORDER BY isnull(districts.name,'1'), schools.name 
5
M.R.
SELECT
 schools.id AS schoolid,
 schools.name AS school,
 districts.id AS districtid,
 districts.name AS district,
 if(schools.districtid IS NULL,1,0) as sort 
FROM sms_schools AS schools
LEFT JOIN sms_districts AS districts 
 ON schools.districtid = districts.id
WHERE 1 = 1
ORDER BY sort, districts.name, schools.name

「新しい」列に並べ替えルールを追加し、任意の番号を使用してコード内のフィールドを非表示にし、if dirctlyで並べ替えることが可能かどうかをテストします(if by if ...)

幸運を

2
borrel