2013-06-02 3 views
0

Я должен заказать sql-результаты по возрастающим числовым значениям. Мой код-то вроде этого:SQL-запрос при наличии значений NULL

ORDER BY CAST(`baseData` AS DECIMAL(10,2)) {$dir} "; 

Это работает так хорошо, но есть проблема: он помещает все значения NULL на дне, я думаю, что он рассматривает их как «0». Мне нужно наложить все значения NULL, как я могу его изменить?

+0

Каков ваш rdbms –

ответ

0

Да, это работает:

ORDER BY baseData = '', CAST(`baseData` AS DECIMAL(10,2)) {$dir} "; 
1

Попробуйте SQL

Для MYSQL

ORDER BY COALESCE(CAST(`baseData` AS DECIMAL(10,2)),0) 

Для Oracle

ORDER BY NVL(CAST(baseData AS DECIMAL(10,2)),0) 

SQL Fiddle

MySQL 5.5.30 Настройка схемы:

create table test(
t varchar(5) 
); 


insert into test 
values('123'),('234'),('222'),(NULL); 

Запрос 1:

select coalesce(cast(t as decimal(10,2)),0) 
from test 
order by coalesce(cast(t as decimal(10,2)),0); 

Results:

| COALESCE(CAST(T AS DECIMAL(10,2)),0) | 
---------------------------------------- 
|         0 | 
|         123 | 
|         222 | 
|         234 | 
+0

Нет, он рандомизирует результаты (я использую MySql) – user2132234

+0

@ user2132234: проверьте обновленный ответ. – ankurtr

+0

В обновленном ответе нет предложения order by в вашем примере. –

0

Если вы хотите поставить все NULLS на голове

ORDER BY CAST(`baseData` AS DECIMAL(10,2)) NULLS FIRST 

, если вы хотите поместить все NULLS в нижней

ORDER BY CAST(`baseData` AS DECIMAL(10,2)) NULLS LAST 

если вы хотите Nulls следует рассматривать как 0, поверг их в качестве Феоникс сделал

ORDER BY Nvl(CAST(`baseData` AS DECIMAL(10,2)), 0) -- Oracle, MS SQL 
    ORDER BY IfNull(CAST(`baseData` AS DECIMAL(10,2)), 0) -- MySQL 

если вы хотите Nulls быть последним, но показывается как 0

select ... 
     Nvl(CAST(`baseData` AS DECIMAL(10,2)), 0) -- Oracle, MS SQL 
     ... 
    order by CAST(`baseData` AS DECIMAL(10,2)) NULLS LAST 
+0

, но где мне поставить параметр «asc» или «desc»? после или до NULLS LAST? – user2132234

+0

ORDER BY [Ваше выражение] ASC NULLS LAST –