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

Заявка за избор на MySQL с име на променлива колона

Най-простото решение е да използвате две отделни заявки.

Използваме резултата от първата заявка, за да генерираме динамично SQL текста за втората заявка.

mysql> SET @colname := '' ; 
mysql> SELECT t.rslt FROM table1 t WHERE t.id = 1 ORDER BY t.rslt LIMIT 1 INTO @colname ;

mysql> SET @sql := CONCAT('SELECT `',@colname,'` FROM table2 ORDER BY 1') ;
mysql> PREPARE stmt FROM @sql ; 
mysql> EXECUTE stmt ;

mysql> DEALLOCATE PREPARE stmt ;

N.B. включително @colname като част от SQL текста, динамично подготвен SQL, е потенциална уязвимост при инжектиране на SQL.

Ако изискването е да се направи нещо подобно в контекста на сингъл SQL израз, тогава изразът трябва да предвиди възможните стойности, които да бъдат върнати за заявката от таблица1, и да включва изрични препратки към възможните колони от таблица2. Например, нещо подобно:

  SELECT CASE ( SELECT t.rslt FROM table1 t WHERE t.id = 1 LIMIT 1 )
           WHEN 'r1' THEN r.r1 
           WHEN 'r2' THEN r.r2 
           WHEN 'r3' THEN r.r3 
           ELSE NULL
         END AS c2
    FROM table2 r
   ORDER BY ...

Това не е непременно най-ефективният начин за написване на заявката, но демонстрира модела.

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

Тоест, поведението, наблюдавано с този SQL, е това, което очакваме:

 SELECT (SELECT rslt FROM table1 WHERE id = 1) FROM table2

SQL текстът се подготвя и по време на изпълнение, за всеки ред в таблица 2, подзаявката в SELECT списъкът се изпълнява. Ако подзаявката върне скаларна стойност, скаларната стойност се връща като колона на външната заявка. Стойността, върната от подзаявката, е стойност , не се оценява (и не може да бъде) оценено като име на колона.



  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 за удостоверяване на потребители в Spring сигурност?

  2. Преобразувайте JSON масив в MySQL в редове

  3. Mysql Бавно вмъкване

  4. Обектите на Django queryset връщат None вместо 0, въпреки че базата данни има 0, съхранена като стойност на полето

  5. Как да създадете MySQL база данни и да зададете привилегии