nie możesz Sparametryzuj nazwę kolumny/tabeli/funkcji/alias. Jak, PREPARE
Instrukcja zezwala na użycie jako parametrów tylko części „wartości” zapytania SQL. Nazwa/alias funkcji/tabeli/kolumny są używane do określenia poprawności instrukcji SQL; i dlatego nie można ich zmienić podczas wykonywania w czasie wykonywania. Zmiana go w czasie wykonywania potencjalnie zmieniłaby poprawność instrukcji SQL.
Możesz myśleć o tym jako o kompilacji kodu; dlatego kompilator musi znać wszystkie nazwy funkcji/klas itp., aby utworzyć poprawny plik wykonywalny (tak, możemy tworzyć klasy dynamiczne, ale to jest rzadkie ). Z drugiej strony, możemy zmienić „wartości” wejściowe do programu, ale ogólnie nie zmienić operacje, które mają być wykonane na danych wejściowych.
Ponadto serwer MySQL traktowałby parametry jako literały i stosował wokół nich cudzysłowy przed użyciem ich w wykonywaniu zapytania.
Teraz, w twoim przypadku, nadal możesz użyć nazwy funkcji jako parametru dla procedury składowanej i wygenerować ciąg zapytania przy użyciu tego. Ale nie możesz użyć go jako parametru dla samego zapytania.
delimiter $$
create procedure test(in func varchar(20), in col varchar(20))
begin
set @c = col;
-- use concat function to generate the query string using func parameter
set @sql = concat('select ', func, '(?) from table');
-- prepare the statement
prepare stmt from @sql;
-- execute
execute x using @c;
-- don't forget to deallocate the prepared statement
deallocate prepare stmt;
end$$
delimiter ;