Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como seleciono coluna(s) por sua posição numérica em uma tabela?


Você quase NUNCA deve confiar no número da coluna em uma tabela em qualquer código (mesmo que você possa teoricamente fazê-lo tecnicamente).

Existem muitos motivos, um dos mais importantes é que alguém sempre pode ALTER na tabela e inserir uma coluna no início/meio, quebrando seu código completamente.

Uma segunda razão é que as posições das colunas - mesmo se você assumir que a tabela nunca muda - tornam o código absolutamente Ilegível e, portanto, impossível de manter o código. Você vai se lembrar que a coluna 13 era "last_name_3" daqui a 2 anos?

Por favor, note que se o seu problema é que, por exemplo, você tem algo como SELECT fn11, fn12, fn13, ... fn32 em seu código, e você sente que soletrar fn11..fn32 é um arrasto, você não está apenas 100% correto, mas você deve remover absolutamente esse arrasto por meio de expressões idiomáticas Perl, como segue:"SELECT " . join(", ", map { "fn$_" } (11..32));

Dito isto, se você quer saber como fazer TEORICAMENTE, apenas como um exercício de "truque tecnológico legal", não conheço uma boa maneira de fazê-lo genericamente via DBI, mas geralmente você pode fazê-lo em banco de dados- maneira específica.

Para isso, você deve observar que:

  1. Praticamente TODOS os bancos de dados criam tabelas por meio de algum tipo de instrução "CREATE TABLE" que recebe uma lista ORDERED de colunas (a maioria dos bancos de dados relacionais armazena fisicamente valores na linha nessa ordem, por isso é importante - mesmo que o cálculo relacional teórico trate as colunas como ordem- menos como disse o marcog).

  2. Praticamente TODOS os bancos de dados contêm uma tabela especial que lista quais tabelas contêm quais colunas (syscolumns no Sybase, INFORMATION_SCHEMA.COLUMNS no MySQL), e essa tabela contém o ID numérico de uma coluna que é usada para ordená-los da mesma forma que "create" order; ou até mesmo um campo "pedido" especial (por exemplo, ORDINAL_POSITION valor no MySQL).

    Assim, você pode - com antecedência - consultar a lista ordenada de colunas para a tabela desejada e sua ordem. Para consultar o MySQL, SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX" . Armazene os dados na lista @columns (ou se você tiver muitas tabelas, um hash de arrays, %columns, com o nome da tabela sendo a chave).

    Então, ao construir uma consulta, você simplesmente diz

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

    Observe que o valor real O SQL enviado ao servidor conterá nomes de colunas, MAS você não codificará esses nomes em nenhum lugar do seu código.