sql >> Databáze >  >> RDS >> Mysql

Přejmenování sloupců tabulky sloupce podle mapování definovaného v jiné tabulce - pomocí MYSQL

Myslím, že rozumím, že chcete vybrat sloupec podle názvu, a názvy jsou řetězce ve vašem TABLE_MASTER.

Nemůžete to udělat v jediném dotazu SQL, protože SQL nemůže vybrat sloupec pomocí řetězcového výrazu. Je rozdíl mezi řetězcem a identifikátorem. Například toto vybírá data ze sloupce podle identifikátoru:

SELECT header01 ...

Ale následuje řetězcový výraz (jednoduchý, který je pouze konstantní hodnotou). Vrací pouze pevný řetězec 'header01', NE data ze sloupce s tímto názvem:

SELECT 'header01' ...

Podobně použití jakéhokoli jiného výrazu ve výběrovém seznamu pouze vybere hodnotu tohoto výrazu, NE data uložená ve sloupci pojmenovaném podle hodnoty řetězce výrazu.

Pokud tedy chcete, aby dotaz vracel dynamický sloupec pojmenovaný jinou proměnnou nebo výrazem, nemůžete to udělat ve stejném dotazu, kde čtete tento výraz. Z načtených hodnot musíte naformátovat nový SQL dotaz. Toto se nazývá dynamický příkaz SQL (již zmínil spencer7593, který zveřejnil odpověď, když jsem psal svou vlastní odpověď).

Svůj TABLE_MASTER můžete použít k formátování dynamického příkazu SQL pro načtení sloupců a předefinování jejich aliasu:

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

Výsledkem je řetězec, který tvoří další příkaz SELECT, tento přejmenovává sloupce, jak chcete:

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

Pak můžete použít řetězec uložený v @sql jako dynamický SQL dotaz.

Zde je postup, který to provede:

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 ;

Zavolejte proceduru a získejte výsledek:

CALL MyProc();

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

Musím poznamenat, že je to velký problém projít. Raději bych načetl data tak, jak jsou v databázi, a přeformátoval je v kódu aplikace. Pak bych k formátování sloupců nemusel používat žádné dynamické SQL.



  1. dotazování na hodnocení uživatelů v tabulkách jedna k mnoha

  2. Jak mohu vytvořit index na podřetězci sloupce?

  3. Jak FOR XML PATH('') funguje při zřetězení řádků

  4. hodnota max_connections v AWS RDS