在MySQL中以字符串形式多次连接变量

时间:2018-11-22 10:41:46

标签: mysql concat heidisql

场景::我试图将字符串设置为变量,然后将其传递给准备好的语句。我正在使用“ concat”函数来创建将要传递的字符串。

查询:

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

肥胖:我的查询中有更多部分要包含在字符串中,但是即使只有这个,我也已经遇到了麻烦,所以我要逐步进行。

问题::当我尝试运行此命令时,在第2行出现语法错误(SQL错误1064)。我不知道为什么会这样。

问题:导致此问题的原因是什么,如何解决?

2 个答案:

答案 0 :(得分:1)

没有这样的 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]>

答案 1 :(得分:1)

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的错误消息可能没有帮助。