2010-11-02 20 views
14

sé queSQL Listado de todos los nombres de columna alfabéticamente

SELECT * FROM Table 

listará todas las columnas en la tabla, pero estoy interesado en la lista de las columnas en orden alfabético.

Digamos que tengo tres columnas, "nombre", "edad" y "sexo".

Quiero las columnas organizadas en el formato

|age| |name| |sex| 

¿Es posible hacer esto con SQL?

Respuesta

12

Sí y no :-)

SQL en sí no importa el orden de las columnas salen en pero, si se fuera a utilizar:

select age, name, sex from ... 

que iba a encontrar que probablemente salió en ese orden (aunque no estoy seguro de que los estándares SQL lo requieran).

Ahora es posible que no quieren de hacer eso, pero a veces La vida no es justa :-)

También tiene otra posibilidad de utilizar las tablas de definición de datos DBMS para construir dinámicamente una consulta. Esto no es portátil, pero la mayoría de los DBMS 'suministran estas tablas (como DB/2's SYSIBM.SYSCOLUMNS) y puede seleccionar los nombres de las columnas desde allí de manera ordenada. Algo así como:

select column_name from sysibm.syscolumns 
where owner = 'pax' and table_name = 'movies' 
order by column_name; 

A continuación, utiliza los resultados de que consulta para la construcción de la consulta real:

query1 = "select column_name from sysibm.syscolumns" + 
     " where owner = 'pax' and table_name = 'movies'" + 
     " order by column_name" 
rs = exec(query1) 
query2 = "select" 
sep = " " 
foreach colm in rs: 
    query2 += sep + colm["column_name"] 
    sep = ", " 
query2 += " from movies order by rating" 
rs = exec(query2) 
// Now you have the rs recordset with sorted columns. 

Sin embargo, realmente debería examinar críticamente todas las consultas que seleccionan * - en la gran mayoría de casos, es innecesario e ineficiente. Y la presentación de los datos es algo que probablemente debería hacerse en la capa de presentación, no en el DBMS en sí mismo: debería dejarse que el DBMS devuelva los datos de la manera más eficiente posible.

+0

hmm, supongo que tengo que recurrir al buen método antiguo de hacer la ordenación de cadenas por mi cuenta :) –

+1

Estoy de acuerdo con esto, NUNCA use * en el código de producción. Nunca se sabe cuando alguien más tarde agrega una columna que NO debe aparecer en la lista, por ejemplo, para la seguridad. Cree siempre la consulta para obtener solo las columnas que necesita. Y si quieres hacerlo dinámicamente, hazlo, pero asegúrate de tenerlo en cuenta para que lo vean otros desarrolladores. –

+0

Una más, si usa vistas SQL * tiene más efectos secundarios si las tablas subyacentes se cambian (columna nueva o eliminada) la vista no se actualiza, por lo que podría no mostrar columnas nuevas O las columnas existentes podrían reemplazarse a medida que la vista selecciona columna por el índice que tenían en vista de creación. –

0

Es posible que sólo especificar las columnas que desee seleccionar:

SELECT age, name, sex FROM Table 

columnas se muestran en el mismo orden en que las ha especificado en la consulta.

+0

Gracias por la respuesta. En realidad, la situación es tal que sería tedioso escribir tantas columnas. Es por eso que me preguntaba si es posible hacer esto directamente mediante consultas SQL. Quizás una alternativa sería enumerar los nombres de las columnas y usar un programa externo para ordenar los nombres de las columnas. –

4
  • No hay forma de hacerlo automáticamente sin SQL dinámico.
  • SELECT * no es recomendable y no clasificar los nombres de las columnas
  • Habría que hacer explícita SELECT age, name, sex FROM

A nivel SQL, no importa. No tiene importancia para ningún objeto de código de cliente:

Si es importante, ordene cuando presente los datos al cliente.

Disculpa, solo es así ...

3

SQL-92 Standard especifica que al usar SELECT * las columnas se referencian en la secuencia ascendente de su posición ordinal dentro de la tabla. Las secciones relevantes son 4.8 (columnas) y 7.9 (especificación de consulta). No sé de ninguna extensión de proveedor del Estándar que permita devolver columnas en ningún otro orden, probablemente porque el uso de SELECT * generalmente no se recomienda.

Puede usar SQL DDL para asegurarse de que las posiciones ordinales de las columnas coincidan con el orden alfabético deseado. Sin embargo, esto solo funcionará de la manera que desee al hacer referencia a una tabla sinlge en la cláusula FROM. Si se hace referencia a dos tablas, SELECT * devolverá las columnas de la primera tabla en orden de posición ordinal seguido de las columnas de la segunda tabla en posición ordinal, por lo que las columnas completas del conjunto de resultados pueden no estar en orden alfabético.

9

Esto genera una consulta con todas las columnas ordenadas alfabéticamente en la instrucción de selección.

DECLARE @QUERY VARCHAR(2000) 
DECLARE @TABLENAME VARCHAR(50) = '<YOU_TABLE>' 

SET @QUERY = 'SELECT ' 
SELECT @QUERY = @QUERY + Column_name + ', 
' 
    FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @TABLENAME 
ORDER BY Column_name 

SET @QUERY = LEFT(@QUERY, LEN(@QUERY) - 4) + ' 
FROM '+ @TABLENAME 

PRINT @QUERY 
EXEC(@QUERY) 
+1

Esto supone que la consulta siempre se ejecutará ad hoc, pero también es un buen punto de partida si el póster está bien con sql dinámico. – RThomas

+2

Funcionó para mí, con esta revisión cambiando la declaración de la izquierda (len) - 4 a -1 – Brian

Cuestiones relacionadas