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

Zapytanie wybierające MySQL ze zmienną nazwą kolumny

Najprostszym rozwiązaniem jest użycie dwóch oddzielnych zapytań.

Używamy wyniku z pierwszego zapytania, aby dynamicznie wygenerować tekst SQL dla drugiego zapytania.

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 ;

Uwaga w tym @colname jako część tekstu SQL, dynamicznie przygotowany SQL, jest potencjalną podatnością na wstrzyknięcie SQL.

Jeśli wymaganiem jest zrobienie czegoś podobnego w kontekście singla Instrukcja SQL, wówczas instrukcja musi przewidywać możliwe wartości do zwrócenia dla zapytania z tabeli 1 i zawierać wyraźne odwołania do możliwych kolumn z tabeli2. Na przykład coś takiego:

  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 ...

Niekoniecznie jest to najskuteczniejszy sposób napisania zapytania, ale demonstruje wzorzec.

W instrukcji SQL identyfikatory (nazwy tabel, nazwy kolumn, nazwy funkcji) muszą być określone jawnie; nie można ich wyprowadzić dynamicznie w czasie wykonywania. Dzieje się tak ze względu na sposób przetwarzania instrukcji SQL... analizowanie tekstu SQL pod kątem składni, następnie analizowanie semantyki (prawidłowe referencje i uprawnienia), ocenianie względnego kosztu dostępnych ścieżek dostępu, wybieranie planu wykonania, a następnie wykonywanie tego planu.

Oznacza to, że zachowanie obserwowane w przypadku tego kodu SQL jest takie, jakiego oczekujemy:

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

Tekst SQL jest przygotowywany i w czasie wykonywania dla każdego wiersza w tabeli2 podzapytanie w SELECT lista jest wykonywana. Jeśli podzapytanie zwraca wartość skalarną, wartość skalarna jest zwracana jako kolumna zapytania zewnętrznego. Wartość zwracana przez podzapytanie to wartość , nie jest (i nie może być) oceniany jako nazwa kolumny.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przeprowadzić migrację z Oracle do MySQL / Percona Server

  2. MySQL Powolne dołączanie. Każdy sposób na przyspieszenie

  3. Jak utworzyć wyzwalacz do usuwania php myadmin

  4. Obliczanie rozmiaru puli buforów InnoDB dla serwera MySQL

  5. Schemat bazy danych do przesyłania wiadomości do wielu użytkowników