Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在动态查询中在变量周围加单引号_Mysql_Dynamic Sql - Fatal编程技术网

Mysql 如何在动态查询中在变量周围加单引号

Mysql 如何在动态查询中在变量周围加单引号,mysql,dynamic-sql,Mysql,Dynamic Sql,我正在尝试构建一个动态查询。最初@Query被设置为查询字符串,然后我想动态添加WHERE子句。它可以工作,只是在本例中@val没有在字符串周围加单引号。这会导致错误。如何包含单引号,以便正确添加它们 这就是我尝试过的: SET @Query = @Query + ' WHERE ' + '' + @param + ' ' + @operator + ' ' + '' + @val + '' ; 谢谢 这起作用了: SET @Query = @Query + ' WHERE ' + '' +

我正在尝试构建一个动态查询。最初@Query被设置为查询字符串,然后我想动态添加WHERE子句。它可以工作,只是在本例中@val没有在字符串周围加单引号。这会导致错误。如何包含单引号,以便正确添加它们

这就是我尝试过的:

SET @Query = @Query + ' WHERE ' + '' + @param + ' ' + @operator + ' ' + '' + @val + '' ;
谢谢

这起作用了:

SET @Query = @Query + ' WHERE ' + '' + @param + ' ' + @operator + ' ' + '''' + @val + '''' ;
编程有时可能非常愚蠢。好的ol'4单引号


无论如何,谢谢各位。

您必须在两个引号之间插入一个引号,但要将其转义,这样它才不会破坏您的代码。它将如下所示:

SET @Query = @Query + ' WHERE ' + '' + @param + ' ' + @operator + ' ' + '\'' + @val + '\'' ;
编辑:埃里克·安德森的答案也适用。取走

带“.”的字符串中的“.”可以写为““””

请尝试以下代码:

DECLARE @SQ [varchar](1) = ''''

SET @Query = @Query + ' WHERE ' + @SQ + @param + @SQ + ' ' + @operator + ' ' + @SQ + @val + @SQ;
开始
设置@mulai=\u tanggalmulai;
设置@akhir=\u tanggalakhir;
如果@mulai'&&@akhir',那么
将@setWhere=”和日期(创建时间)设置在STR_TO_date(@mulai,“%d/%m/%Y”)和STR_TO_date(@akhir,“%d/%m/%Y”)之间;
ELSEIF@mulai'&&&akhir=''
SET@setWhere='和date(created_at)>NOW();
ELSEIF@mulai=''&&@akhir'',然后
设置@setWhere=”和日期(创建时间)
如果您使用的是MySQL,您需要知道
+
不是字符串连接运算符(这是Microsoft SQL Server和Access中的非标准语法)

MySQL使用一个内置函数:

或者,您可以设置模式(或者更具体地说是模式)并使用SQL标准字符串连接:

SET sql_mode = 'ANSI';
SET @Query = @Query || ' WHERE ' || @param || @operator || '?';
PREPARE stmt FROM @Query;
EXECUTE stmt USING @val;
DEALLOCATE stmt;
对于值,SQL表达式中不需要引号中的
占位符,事实上它不能在引号中,否则它将是一个文本
“?”
字符串,而不是一个参数占位符


您不能参数化列名或运算符,只能参数化值。

我猜(因为我不确定)是因为您添加的
'
为空。如果一个引号表示字符串的开始,一个表示结束,中间没有什么。如果你想要中间的一个,你可能需要有<代码> ''/c> >。使用反斜杠来逃脱:<代码>…+ ''' +……<代码>,但这会使您面临sql注入漏洞,因此您最好准备一个带有占位符的语句。您确定要使用MySQL吗?MySQL不使用
+
进行字符串连接,它使用
CONCAT()
函数。为什么在
WHERE
之后有
+'+
?连接一个空字符串的目的是什么?因为否则它看起来像“WHERE param=val”我只是想让它看起来像“WHERE param=val”我不是说
val
周围的引号,我是说
@param
之前的引号。你在那里得到了多么有趣的利用。巴尔马也提出了一个合理的问题。我只是希望其他人,谁偶然发现这个问题不会做你做的,这是可怕的。哦,我很抱歉,我第一天使用MySQL没有让你惊讶。也许如果你提供建设性的批评,而不是故意消极,那么人们就会从他们的错误中吸取教训。
SET @Query = CONCAT(@Query, ' WHERE ', @param, @operator, '?');
PREPARE stmt FROM @Query;
EXECUTE stmt USING @val;
DEALLOCATE stmt;
SET sql_mode = 'ANSI';
SET @Query = @Query || ' WHERE ' || @param || @operator || '?';
PREPARE stmt FROM @Query;
EXECUTE stmt USING @val;
DEALLOCATE stmt;