MySQL Orderby число, пустые строки (или 0) Последние
просто задал вопрос, очень похожий на этот...
В настоящее время я делаю очень простой порядок в своем заявлении.
SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC
проблема в том, что пустые строковые записи для 'position' обрабатываются как 0. Поэтому все записи с позицией в виде пустой строки отображаются перед записями с 1,2,3,4. например:
", ", ", 1, 2, 3, 4
или
0, 0, 0, 1, 2, 3, 4
есть ли способ достичь следующего заказ:
1, 2, 3, 4, ", ", ".
или
1, 2, 3, 4, 0, 0, 0.
Я предполагаю, что решение может иметь какую-то функцию замены, но я не смог найти функцию, которая делает то, что мне нужно, через google.
Большое Спасибо,
JonB
4 ответов
SELECT *
FROM tablename
WHERE visible=1
ORDER BY
case when position in('', '0') then 1 else 0 end,
position ASC,
id DESC
попробуй CASE statement, например:
SELECT *
FROM tablename
WHERE visible = 1
ORDER BY CASE position WHEN '' THEN '9999' ELSE position END CASE ASC,
ID DESC
вы говорите, что position
содержит пустые строковые записи...вы действительно имеете в виду пустую строку, или вы имеете в виду NULL
? Если он действительно содержит NULL
записи, вы должны использовать небольшую модификацию заявление Orbman это:
SELECT *
FROM tablename
WHERE visible=1
ORDER BY
COALESCE(position, ~0)
, id DESC
COALESCE()
возвращает значение первого аргумента, который NOT NULL
. ~0-это часть черной магии, которая даст вам максимальное целочисленное значение, поддерживаемое MySQL. (~делает побитовое отрицание, превращая все 0 бит в 1). Итак, в этом случае, если position IS NULL
- это правда, он будет возвращать 18446744073709551615
, иначе он вернет значение position
.
Я также хотел бы отметить, что тип данных вашего
вы можете попытаться объединить два подзапроса, где один выберите id > 0 и не пустой, а другой выберите пустой и 0 только