Mysql
 sql >> база данни >  >> RDS >> Mysql

Преименуване на колоните на колони на таблица според преобразуване, дефинирано в друга таблица - с MYSQL

Мисля, че разбирам, че искате да изберете колона по име, а имената са низове във вашия TABLE_MASTER.

Не можете да направите това в една SQL заявка, защото SQL не може да избере колона с помощта на низов израз. Има разлика между низ и идентификатор. Например, това избира данни от колона по идентификатор:

SELECT header01 ...

Но следното е низов израз (прост, който е само постоянна стойност). Връща само фиксиран низ „header01“, НЕ данните от колона с това име:

SELECT 'header01' ...

По същия начин, използването на който и да е друг израз в списък за избор избира само стойността на този израз, НЕ и данните, съхранени в колона, наречена от низовата стойност на израза.

Следователно, ако искате дадена заявка да върне динамична колона, наречена от някаква друга променлива или израз, не можете да го направите в същата заявка, в която четете този израз. Трябва да форматирате нова SQL заявка от стойностите, които сте прочели. Това се нарича динамичен SQL израз (вече споменато от spencer7593, който публикува отговор, докато аз пишех собствения си отговор).

Можете да използвате своя TABLE_MASTER, за да форматирате динамичен SQL оператор, за да извлечете колони и да предефинирате техните псевдоними:

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

Резултатът от това е низ, който формира друг оператор SELECT, който преименува колоните, както желаете:

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

След това можете да използвате низа, съхранен в @sql като динамична SQL заявка.

Ето процедурата, която прави това:

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 ;

Извикайте процедурата и получете резултата:

CALL MyProc();

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

Трябва да коментирам, че това е много трудност, през която трябва да се премине. Предпочитам да извлека данните така, както са в базата данни, и да ги преформатирам в кода на приложението си. Тогава няма да се налага да използвам динамичен SQL за форматиране на колоните.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създайте персонализиран метод за доставка в OpenCart:Част втора

  2. Как да изпращам данни от android към mysql сървър?

  3. Предупреждение:mysql_real_escape_string() [function.mysql-real-escape-string]:Връзка към сървъра не може да бъде установена в

  4. Форматирайте число като процент в MySQL

  5. SQL заявката връща данни от множество таблици