2013-07-08 2 views
2

Моя колонка базы данных представляет собой тип данных varchar(25) со значениями 1 1/2 ", 1/2", 3 "и 4", представляющие диаметры шлангов для пожарной станции. Проблема, с которой я сталкиваюсь, заключается в том, что следующий код выплескивает диаметры шлангов в вышеуказанном порядке в базе данных, когда я хочу заказать в порядке возрастания, что означает, что я хочу «1/2, 1 1/2, 3, 4» не с 1 1/2 спереди. Есть ли способ сделать это в SQL с дробными значениями данных для моего типа данных varchar?Правильная сортировка дробных данных в SQL Выберите

Спасибо!

PHP код

// Select hose locations from fire database 
$query = "SELECT hose_diameter FROM hose_diameter ORDER BY hose_diameter"; 
$result = $mysqli->query($query) or die($mysqli->error.__LINE__); 

//FETCH ROWS 
if($result->num_rows > 0) { 
    while($row = $result->fetch_assoc()) { 
     print "<option value=\"".$row['hose_diameter']."\">".$row['hose_diameter']."</option>"; 
    } 
} 
+0

Лично я бы изменил вашу базу данных так, чтобы в ней было фактическое десятичное значение, которое вы могли бы отсортировать правильно. У вас могут быть как обычные столбцы, так и один, вычисленный на основе другого, или просто иметь десятичный код, и пусть приложение переводит это на читаемые значения. Или у вас может быть таблица перевода, к которой вы присоединяетесь (например, идея подзапроса Гордона, но с реальной таблицей) также будет работать, если ваши возможные значения будут исправлены. Но я бы избегал иметь только смешанную строку в базе данных, если вы хотите рассматривать ее как число. –

ответ

1

Вот один из способов. Она просто избавляется от «1/2» для первого сорта, а затем добавляет его обратно в:

order by replace(diam, '1/2', ''), diam 

Конечно, это не может легко обобщается на другие фракции очень легко.

Другой способ заключается в добавлении '0' на фронт, когда она начинается с одного символа перед '/':

order by (case when diam like '_/%' then '0'+diam else diam end) 

Наконец, вы могли бы иметь таблицу поиска для диаметра как номер:

SELECT hd.hose_diameter 
FROM hose_diameter hd left outer join 
    (select '1/2' as hose_diameter, 0.5 as units union all 
     select '1 1/2', 1.5 union all 
     select '3', 3 union all 
     select '4', 4 
    )diams 
    on hd.hose_diameter = diams.hose_diameter 
ORDER BY diams.units; 

Я действительно предпочитаю этот метод, потому что намерение ясно.

EDIT:

Я не понимаю, комментарий. Я только что протестировал этот код:

with hose_diameter as (
     select '1/2' as diam union all 
     select '1 1/2' union all 
     select '3' 
    ) 
SELECT hd.diam 
FROM hose_diameter hd left outer join 
    (select '1/2' as hose_diameter, 0.5 as units union all 
     select '1 1/2', 1.5 union all 
     select '3', 3 union all 
     select '4', 4 
    ) diams 
    on hd.diam = diams.hose_diameter 
ORDER BY diams.units; 

И возвращается:

1/2 
1 1/2 
3 

Я тестировал первую версию, и она возвращает тот же порядок. И вторая версия тоже.

+0

Спасибо, но когда я внедрил ваш код, он просто дает тот же результат. – jflay

+0

Ваши первые два заказа по заявлениям работали! благодаря – jflay

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