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

Comment puis-je sélectionner * dans une table de MySQL mais omettre certaines colonnes ?

Alors que beaucoup disent qu'il est préférable de répertorier explicitement chaque colonne que vous souhaitez renvoyer, il existe des situations où vous souhaiterez peut-être gagner du temps et omettre certaines colonnes des résultats (par exemple, les tests). Ci-dessous, j'ai donné deux options qui résolvent ce problème.

1. Créer une fonction qui récupère tous les noms de colonnes souhaités :(j'ai créé un schéma appelé functions pour contenir cette fonction)

DELIMITER $$

CREATE DEFINER=`root`@`%` FUNCTION `getTableColumns`(_schemaName varchar(100), _tableName varchar(100), _omitColumns varchar(200)) RETURNS varchar(5000) CHARSET latin1
BEGIN
    SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns 
    WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,_omitColumns) = 0 ORDER BY ORDINAL_POSITION;
END

Créez et exécutez l'instruction select :

SET @sql = concat('SELECT ', (SELECT 
functions.getTableColumns('test', 'employees', 'age,dateOfHire')), ' FROM test.employees'); 
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

2. OU sans écrire de fonction, vous pourriez :

SET @sql = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM 
information_schema.columns WHERE table_schema = 'test' AND table_name = 
'employees' AND column_name NOT IN ('age', 'dateOfHire')), 
' from test.eployees');  
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

*Remplacez test par votre propre nom de schéma

**Remplacez les employés par votre propre nom de table

***Remplacez age,dateOfHire par les colonnes que vous souhaitez omettre (vous pouvez le laisser vide pour renvoyer toutes les colonnes ou simplement entrer un nom de colonne à omettre)

** ** Vous pouvez ajuster les longueurs des varchars dans la fonction pour répondre à vos besoins