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 только