2

「はい」または「30分」などを返す「利用可能」列があります。この表を並べ替えると、「はい」が最初に来て「30 分」が後に来るところが意図したとおりに機能することがわかりました。
order by available + 0 asc
これは機能しますが、列に +0 を設定する必要がある理由がわかりません。誰かが詳しく説明できますか?

編集: これはクエリの例です。
すべての where 句がここにあるわけではありません。if(x is null) は、結果が null 値ではない場合に何かを返すことに注意してください。

select distinct r.rname, if(b.stime is null, 'Yes', 'Yes') as available, r.mperson
from Rooms r left outer join Bookings b using (rname)
union all
select b.rname, concat(minute(timediff(b.etime, '$sdate')), ' min') as available,      r.mperson
from     Bookings b inner join Rooms r using(rname)
order by    available + 0 asc, rname asc
4

1 に答える 1

4

available試してみるとわかるように、暗黙的に値を数値に変換しています

select "30 minutes" + 0; ==> returns 30
select "2 hours" + 0; ==> returns 2
select "yes" + 0; ==> returns 0

これにより、"yes"(または数字で始まらない任意の文字列) が、最後の値ではなく最初に返される値になります。

これにより順序変更されますが、これはハッキーに感じられ、純粋な数値フィールド (インデックスを作成できる) を使用するよりも効率的ではありません。

より一般的には、正確な非ポリモーフィック フィールドを持つように、常にスキーマを定義する必要があります。

于 2013-05-21T11:42:11.117 に答える