sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag välja * från en tabell i MySQL men utelämna vissa kolumner?

Även om många säger att det är bästa praxis att uttryckligen lista varje kolumn du vill ha returnerad, finns det situationer där du kanske vill spara tid och utelämna vissa kolumner från resultaten (t.ex. testning). Nedan har jag gett två alternativ som löser detta problem.

1. Skapa en funktion som hämtar alla önskade kolumnnamn:(Jag skapade ett schema som heter funktioner för att hålla denna funktion)

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

Skapa och kör select-satsen:

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

2. ELLER utan att skriva en funktion kan du:

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;

*Ersätt testet med ditt eget schemanamn

**Ersätt anställda med ditt eget bordsnamn

***Ersätt age,dateOfHire med de kolumner du vill utelämna (du kan lämna det tomt för att returnera alla kolumner eller bara ange ett kolumnnamn för att utelämna)

** **Du kan justera längden på varcharerna i funktionen för att möta dina behov



  1. Generera serier av datum - använd datumtyp som indata

  2. VISA DATABASER Motsvarar SQL Server – sp_databases

  3. Varför producerar en parameteriserad fråga mycket långsammare frågeplan jämfört med icke-parameteriserad fråga

  4. Programmeringsfel:SQLite-objekt skapade i en tråd kan bara användas i samma tråd