2013-05-21 20 views
1

我有一個「可用」列,它返回「是」或例如「30分鐘」。 爲了對這張表進行排序,我們發現這是按照預期工作的,其中「是」是第一位,而「30分鐘」是在後面。
order by available + 0 asc
即使這個工作,我們不知道爲什麼我們必須把+0的列。有人可以詳細說明嗎?在order子句中使用+0

編輯:這是一個查詢的例子
請注意,所有where子句不在這裏,if(x爲null)是返回一些東西,如果沒有結果aka 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 
+0

你能否提供表格結構和最簡單的查詢來顯示問題?否則,一切都只是猜測。 – Ben

+0

這會將該列視爲數字。不知道這是如何適用於「是」和「30分鐘」,但我不會依賴這種行爲。嘗試轉換更明確。 – Thilo

+0

「是」和「30分鐘」並不真正合在一起......一個帶有「0」和「30」的整數列會更好(並且可能快一百萬倍) – Alex

回答

3

你的available值隱含轉換成一個數字,你可以通過嘗試

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

這使得"yes"(或任何字符串不是由數字開頭)看到的第一個返回值,而不是最後一個。

確實改變順序,但這感覺hacky和效率比使用純數字字段(可以索引)低效。

更一般地,你總是應該定義你的模式,以便有精確的非多態字段。

+1

在其他平臺上,選擇「是」+ 0將使dbms抱怨列「yes」不存在。 '選擇'是'+ 0'會讓dbms抱怨輸入無效。 –

+1

@ MikeSherrill'Catcall'這是MySQL。它可以讓你做更多的事情,包括你不應該做的事情。 –

+2

這是我的觀點。 「解決方案」之所以對你感到不安是因爲它在大多數平臺上都不是有效的SQL。 –