Конкатенация переменной несколько раз в строке в MySQL - PullRequest
0 голосов
/ 22 ноября 2018

Сценарий: Я пытаюсь установить строку для переменной, а затем передать ее в подготовленный оператор.Я использую функцию "concat" для создания строки, которая будет передана.

Запрос:

set @floatvar := 'test1'    
set @random_var2 := concat('SELECT ', @floatvar, ' AS Fields, COUNT(CASE WHEN ', @floatvar, ' IS NULL THEN 1 END) AS NullCount');

Obs: Мой запросУ меня есть больше частей для включения в строку, но даже с этим у меня уже есть проблемы, поэтому я делаю это шаг за шагом.

Проблема: Когда я пытаюсь запустить это, я получаю синтаксическую ошибку (ошибка SQL 1064) в строке 2. Я понятия не имею, почему это происходит.

Вопрос: В чем причина этой проблемы и как ее можно исправить?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018
set @floatvar := 'test1' ;

set @random_var2 := (select concat('SELECT ', @floatvar, ' AS Fields, COUNT(CASE WHEN ', @floatvar, ' IS NULL THEN 1 END) AS NullCount'));

select @random_var2; 

дает это

SELECT test1 AS Fields, COUNT(CASE WHEN test1 IS NULL THEN 1 END) AS NullCount;

Результаты в

ERROR 1054 (42S22): Unknown column 'test1' in 'field list'

Если вы сделаете это

prepare sqlstmt = @random_var2;
execute sqlstmt;
deallocte prepare sq;stmt;

результат

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '= @random_var2' at line 1

Лучше проверить, что подготовленный оператор работает до запуска в динамический SQL, потому что сообщения об ошибках из динамического SQL могут быть бесполезны.

0 голосов
/ 22 ноября 2018

Нет SELECT .. INTO .. ​​ вот так:

SELECT 
 concat('SELECT ', @floatvar, ' AS Fields, COUNT(CASE WHEN ', @floatvar, ' IS NULL THEN 1 END) AS NullCount')
INTO @myquery;

Образец

MariaDB [test]> SET @floatvar := 'test1'    ;
Query OK, 0 rows affected (0.002 sec)

MariaDB [test]> SELECT
    ->  concat('SELECT ', @floatvar, ' AS Fields, COUNT(CASE WHEN ', @floatvar, ' IS NULL THEN 1 END) AS NullCount')
    -> INTO @myquery;
Query OK, 1 row affected (0.000 sec)

MariaDB [test]>
MariaDB [test]> SELECT @myquery;
+--------------------------------------------------------------------------------+
| @myquery                                                                       |
+--------------------------------------------------------------------------------+
| SELECT test1 AS Fields, COUNT(CASE WHEN test1 IS NULL THEN 1 END) AS NullCount |
+--------------------------------------------------------------------------------+
1 row in set (0.000 sec)

MariaDB [test]>
...