Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment sélectionner une ou plusieurs colonnes en fonction de leur position numérique dans un tableau ?

Vous ne devriez presque JAMAIS vous fier au numéro de colonne d'un tableau dans n'importe lequel de vos codes (même si vous POUVEZ théoriquement le faire techniquement).

Il y a plusieurs raisons, l'une des plus importantes est que quelqu'un peut toujours MODIFIER le tableau et insérer une colonne au début/au milieu, cassant complètement votre code.

Une deuxième raison est que les positions des colonnes - même si vous supposez que la table ne change jamais - rendent le code absolument ILLISIBLE et donc impossible à maintenir. Vous souviendrez-vous que la colonne 13 était "last_name_3" dans 2 ans ?

Veuillez noter que si votre problème est que, par exemple, vous avez quelque chose comme SELECT fn11, fn12, fn13, ... fn32 dans votre code, et vous avez envie d'épeler fn11..fn32 est un frein, non seulement vous avez raison à 100 %, mais vous devez absolument supprimer ledit frein via les idiomes Perl, comme suit :"SELECT " . join(", ", map { "fn$_" } (11..32));

Cela dit, si vous voulez savoir comment le faire THÉORIQUEMENT, tout comme un exercice "astuce technologique sympa", je ne connais pas de bonne façon de le faire de manière générique via DBI, mais vous pouvez généralement le faire dans la base de données- manière spécifique.

Pour ce faire, vous devez noter que :

  1. Presque TOUTES les bases de données créent des tables via une sorte d'instruction "CREATE TABLE" qui prend une liste ORDERED de colonnes (la plupart des bases de données relationnelles stockent physiquement les valeurs dans la ligne dans cet ordre, donc c'est important - même si le calcul relationnel théorique traite les colonnes comme ordre- moins comme l'a dit marcog).

  2. Presque TOUTES les bases de données contiennent une table spéciale qui répertorie quelles tables contiennent quelles colonnes (syscolumns dans Sybase, INFORMATION_SCHEMA.COLUMNS dans MySQL), et cette table contient l'ID numérique d'une colonne qui est utilisée pour les ordonner de la même manière que l'ordre "créer" ; ou même un champ "commande" spécial (par exemple ORDINAL_POSITION valeur dans MySQL).

    Ainsi, vous pouvez - à l'avance - interroger la liste ordonnée des colonnes pour la table souhaitée et leur ordre. Pour interroger MySQL, SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX" . Stockez les données dans la liste @columns (ou si vous avez plusieurs tables, un hachage de tableaux, %columns, avec le nom de la table comme clé).

    Ensuite, lors de la création d'une requête, vous dites simplement

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

    Veuillez noter que le réel Le SQL envoyé au serveur contiendra les noms de colonne, MAIS vous ne coderez en dur ces noms nulle part dans votre code.