sql >> Database >  >> RDS >> Mysql

De kolommen van een tabelkolommen hernoemen volgens een toewijzing die in een andere tabel is gedefinieerd - met MYSQL

Ik denk dat ik begrijp dat je een kolom op naam wilt selecteren, en de namen zijn tekenreeksen in je TABLE_MASTER.

U kunt dit niet in één SQL-query doen, omdat SQL geen kolom kan selecteren met behulp van een tekenreeksexpressie. Er is een verschil tussen een string en een identifier. Dit selecteert bijvoorbeeld gegevens uit een kolom op ID:

SELECT header01 ...

Maar het volgende is een tekenreeksuitdrukking (een eenvoudige, die slechts een constante waarde is). Het retourneert alleen een vaste tekenreeks 'header01', NIET de gegevens uit een kolom met die naam:

SELECT 'header01' ...

Evenzo selecteert het gebruik van een andere uitdrukking in een selectielijst alleen de waarde van die uitdrukking, NIET de gegevens die zijn opgeslagen in een kolom die wordt genoemd door de tekenreekswaarde van de uitdrukking.

Als u dus wilt dat een query een dynamische kolom retourneert die wordt genoemd door een andere variabele of expressie, kunt u dit niet doen in dezelfde query waarin u die expressie leest. U moet een nieuwe SQL-query opmaken op basis van de waarden die u leest. Dit heet een dynamische SQL-instructie (reeds genoemd door spencer7593, die een antwoord plaatste terwijl ik mijn eigen antwoord aan het schrijven was).

U kunt uw TABLE_MASTER gebruiken om een ​​dynamische SQL-instructie op te maken om kolommen op te halen en hun alias opnieuw te definiëren:

SELECT CONCAT(
  'SELECT ', 
   GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ', 
   QUOTE(MAX(NAME)), ' AS NAME ',
  'FROM TABLE_EXAMPLE'
) INTO @sql
FROM TABLE_MASTER;

Het resultaat hiervan is een string die een andere SELECT-instructie vormt, deze hernoemt de kolommen zoals u wilt:

SELECT header01 AS header_master01,header02 AS header_master02, 'Paul' AS NAME FROM TABLE_EXAMPLE  

Dan kun je de string gebruiken die is opgeslagen in @sql als een dynamische SQL-query.

Dit is de procedure die dit doet:

DELIMITER ;;

CREATE PROCEDURE MyProc()
BEGIN
    SELECT CONCAT(
      'SELECT ', 
       GROUP_CONCAT(CONCAT(ORIGIN, ' AS ', TARGET)), ', ', 
       QUOTE(MAX(NAME)), ' AS NAME ',
      'FROM TABLE_EXAMPLE'
    ) INTO @sql
    FROM TABLE_MASTER;
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

DELIMITER ;

Roep de procedure aan en krijg het resultaat:

CALL MyProc();

+-----------------+-----------------+------+
| header_master01 | header_master02 | NAME |
+-----------------+-----------------+------+
| data01          | data02          | Paul |
| data11          | data12          | Paul |
+-----------------+-----------------+------+

Ik moet zeggen dat dit veel moeite kost. Ik zou liever de gegevens ophalen zoals deze zich in de database bevinden en deze opnieuw formatteren in mijn applicatiecode. Dan zou ik geen dynamische SQL hoeven te gebruiken om de kolommen op te maken.



  1. Een globale statische variabele maken in SQL Server?

  2. mySQL-regex in de waar-clausule

  3. Help alstublieft de SQL Server-statistieken te verbeteren!

  4. Deze query wijzigen om rijen te groeperen en alle rijen uit te filteren, behalve die met de kleinste waarde