2010-01-12 7 views
7

Sólo hizo una pregunta muy similar a éste ...MySQL orderBy un número, cadenas vacías (o de 0) Última

Actualmente estoy haciendo un OrdenarPor muy básico en mi declaración.

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC 

El problema con esto es que las entradas de cadena vacía para 'posición' se tratan como 0. Por lo tanto todas las entradas con la posición como cadena vacía aparecen antes que las de 1,2,3,4. por ejemplo:

'', '', '', 1, 2, 3, 4

o

0, 0, 0, 1, 2, 3, 4

¿Hay una forma de lograr el siguiente orden:

1, 2, 3, 4, '', '', ''.

o

1, 2, 3, 4, 0, 0, 0.

Asumo la solución puede tener algún tipo de función de reemplazar pero no he sido capaz de encontrar una función que hace lo que estoy buscando, a través de google.

Muchas gracias,

JonB

Respuesta

15
SELECT * 
FROM tablename 
WHERE visible=1 
ORDER BY 
    case when position in('', '0') then 1 else 0 end, 
    position ASC, 
    id DESC 
+1

Creo que esto funcionará, pero no es la mejor solución. Creo que 'position' debería ser una columna entera, y si ese es el caso, la expresión' CASE' debería usar enteros también, no cadenas. Si 'position' no es un número entero o al menos numérico, la ordenación como números no funcionará de todos modos. Además, esta solución agrega una nueva columna para ordenar, lo que probablemente tendrá un impacto negativo en el rendimiento.Si mi suposición de que 'position' es realmente un entero es correcto, entonces el OP probablemente signifique el valor' NULL' donde escribió 'empty string', lo que significa que simplemente puede escribir 'ORDER BY COALESCE (posición, ~ 0), id DESC' –

+0

@Roland: el OP implicó bastante claramente que la posición es una cadena: * "El problema con esto es que las entradas de cadena vacías para 'posición' se tratan como 0." * – RedFilter

+0

OrbMan sí, lo hizo. Y digo que eso es probablemente parte del problema. Mi sugerencia fue darle un tipo de datos adecuado por adelantado en lugar de tratar de limpiarlo después. –

0

puede intentar unir dos consultas sub donde un selecto id> 0 y no está vacío y el otro seleccione vacía y 0 solamente

1

Usted puede tratar un CASE statement, así:

SELECT * 
FROM tablename 
WHERE visible = 1 
ORDER BY CASE position WHEN '' THEN '9999' ELSE position END CASE ASC, 
    ID DESC 
+0

Me doy cuenta de que esta es una respuesta antigua, pero me salvó el trasero. ¡Gracias hombre! – mingos

1

Es decir que position contiene entradas de cadena vacías ... ¿Realmente quieres decir cadena vacía, o quieres decir NULL? Si en realidad contiene NULL entradas, se debe utilizar una ligera modificación de la declaración de Orbman:

SELECT * 
FROM tablename 
WHERE visible=1 
ORDER BY 
    COALESCE(position, ~0) 
, id DESC 

COALESCE() devuelve el valor del primer argumento de que es NOT NULL. El ~ 0 es una pieza de magia negra que le proporcionará el valor entero máximo admitido por MySQL. (~ hace una negación a nivel de bit, convirtiendo todos los 0 bits en 1). Entonces, en este caso, si position IS NULL es verdadero, devolverá 18446744073709551615, de lo contrario devolverá el valor de position.

También me gustaría señalar que el tipo de datos de su columna position debería ser de algún tipo entero (consulte http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html). Como mencionas las cadenas vacías, creo que deberías verificar la definición de tu tabla haciendo SHOW CREATE TABLE <tablename>. Si la posición no es un tipo entero, te aconsejaría que la cambies. La razón principal es que las cadenas, incluso si parecen números, no se clasifican como números.

Cuestiones relacionadas