2013-05-21 3 views
1

У меня есть столбец «доступно», который либо возвращает «да», либо, например, «30 минут». Чтобы отсортировать эту таблицу, мы обнаружили, что это работает так, как предполагалось, где «Да» на первом месте, а «30 минут» - после.
order by available + 0 asc
Несмотря на то, что это работает, мы не знаем, почему мы должны поставить +0 в столбец. Может кто-то уточнить?Использование +0 в порядке заказа

Редактировать: Это пример по запросу
Обратите внимание, что все где предложения здесь не указаны, а if (x is null) - это что-то возвращать, если нет результата aka null value.

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" (или любая строка, не начинающаяся номером) первое возвращаемое значение вместо из последнего.

Этот делает изменение заказа, но это чувствует себя взломанным и менее эффективно, чем использование чистого числового поля (которое может быть проиндексировано).

В общем, вы всегда должны определять свою схему, например, иметь точные неполиморфные поля.

+1

На других платформах 'select 'yes" + 0' заставит dbms жаловаться на столбец «yes» не существует. 'select 'yes' + 0' заставит dbms жаловаться на недопустимый ввод. –

+1

@ MikeSherrill'Catcall 'Это MySQL. Это позволяет вам делать больше вещей, в том числе те, которые вам не нужны. –

+2

Это была моя точка зрения. Причина, по которой «решение» кажется вам взломанной, заключается в том, что она недействительна SQL на большинстве платформ. –

Смежные вопросы