Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zmiana nazw kolumn tabeli zgodnie z mapowaniem zdefiniowanym w innej tabeli - z MYSQL

Myślę, że rozumiem, że chcesz wybrać kolumnę według nazwy, a nazwy są ciągami w TABLE_MASTER.

Nie można tego zrobić w pojedynczym zapytaniu SQL, ponieważ SQL nie może wybrać kolumny za pomocą wyrażenia ciągu. Istnieje różnica między ciągiem a identyfikatorem. Na przykład wybiera dane z kolumny według identyfikatora:

SELECT header01 ...

Ale poniżej jest wyrażenie tekstowe (proste, które jest po prostu wartością stałą). Zwraca tylko stały ciąg 'header01', NIE dane z kolumny o tej nazwie:

SELECT 'header01' ...

Podobnie, użycie dowolnego innego wyrażenia z listy wyboru wybiera tylko wartość tego wyrażenia, a NIE dane przechowywane w kolumnie nazwanej wartością ciągu wyrażenia.

Dlatego jeśli chcesz, aby zapytanie zwracało kolumnę dynamiczną o nazwie innej zmiennej lub wyrażenia, nie możesz tego zrobić w tym samym zapytaniu, w którym odczytujesz to wyrażenie. Musisz sformatować nowe zapytanie SQL z odczytanych wartości. Nazywa się to dynamiczną instrukcją SQL (wspomniany już przez spencer7593, który opublikował odpowiedź, gdy pisałem własną odpowiedź).

Możesz użyć swojego TABLE_MASTER do sformatowania dynamicznej instrukcji SQL w celu pobrania kolumn i przedefiniowania ich aliasów:

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

Wynikiem tego jest łańcuch, który tworzy kolejną instrukcję SELECT, która zmienia nazwy kolumn według potrzeb:

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

Następnie możesz użyć ciągu zapisanego w @sql jako dynamiczne zapytanie SQL.

Oto procedura, która to robi:

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 ;

Wywołaj procedurę i uzyskaj wynik:

CALL MyProc();

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

Muszę skomentować, że jest to wiele kłopotów. Wolałbym pobrać dane tak, jak są w bazie danych i przeformatować je w kodzie aplikacji. Wtedy nie musiałbym używać żadnego dynamicznego SQL do formatowania kolumn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql SELECT INTO Variable:zwraca null

  2. Jak wykonujemy operacje na binarnym typie danych SQL?

  3. Policz liczbę tagów podrzędnych z XML w SQL

  4. Obsługa MySQL dla Pythona, który nie jest objęty licencjami podobnymi do GPL

  5. Liczenie wystąpień o unikalnej wartości w polu