sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo selecciono las columnas por su posición numérica en una tabla?

Casi NUNCA debe confiar en el número de columna en una tabla en ninguno de sus códigos (aunque teóricamente PUEDE hacerlo técnicamente).

Hay muchas razones, una de las más importantes es que alguien siempre puede ALTERAR la tabla e insertar una columna al principio/medio, rompiendo su código por completo.

Una segunda razón es que las posiciones de las columnas, incluso si asume que la tabla nunca cambia, hacen que el código sea absolutamente ILEGIBLE y, por lo tanto, imposible de mantener. ¿Recordarás que la columna 13 era "last_name_3" dentro de 2 años?

Tenga en cuenta que si su problema es que, por ejemplo, tiene algo como SELECT fn11, fn12, fn13, ... fn32 en su código, y tiene ganas de deletrear fn11..fn32 es un lastre, no solo es 100% correcto, sino que debe eliminar absolutamente dicho lastre a través de expresiones idiomáticas de Perl, de la siguiente manera:"SELECT " . join(", ", map { "fn$_" } (11..32));

Habiendo dicho eso, si quieres saber cómo hacerlo TEÓRICAMENTE, solo como un ejercicio de "truco tecnológico genial", no conozco una buena manera de hacerlo genéricamente a través de DBI, pero generalmente puedes hacerlo en la base de datos. forma específica.

Para ello, debes tener en cuenta que:

  1. Prácticamente TODAS las bases de datos crean tablas a través de algún tipo de instrucción "CREATE TABLE" que toma una lista ORDENADA de columnas (la mayoría de las bases de datos relacionales en realidad almacenan físicamente valores en la fila en ese orden, por lo que es importante, incluso si el cálculo relacional teórico trata las columnas como orden). menos como dijo marcog).

  2. Prácticamente TODAS las bases de datos contienen una tabla especial que enumera qué tablas contienen qué columnas (syscolumns en Sybase, INFORMATION_SCHEMA.COLUMNS en MySQL), y esa tabla contiene la identificación numérica de una columna que se usa para ordenarlos de la misma manera que "crear" orden; o incluso un campo especial de "pedido" (por ejemplo, ORDINAL_POSITION valor en MySQL).

    Por lo tanto, puede, con anticipación, consultar la lista ordenada de columnas para la tabla que desea y su orden. Para consultar MySQL, SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX" . Almacene los datos en la lista @columns (o si tiene muchas tablas, un hash de matrices, %columns, siendo el nombre de la tabla la clave).

    Luego, al crear una consulta, simplemente diga

    "select $columns{table1}->[11],$columns{table1}->[13], ...."

    Tenga en cuenta que el real El SQL enviado al servidor contendrá nombres de columna, PERO no codificará esos nombres en ninguna parte de su código.