我有一个对可变字符串执行 LIKE 条件的查询:
当变量包含一个包含单引号的单词时,返回一些结果,但不是全部:
<cfset _myVar = "Women's" />
<cfquery name="_qData" dbtype="Query">
SELECT
ID
FROM MyQoQ
WHERE NAME LIKE '%#_myvar#%'
OR DESCRIPTION LIKE '%#_myvar#%'
</cfquery>
当变量包含多个单词,并且其中一个单词包含单引号时,不返回任何记录:
<cfset _myVar = "Women's Initiative" />
<cfquery name="_qData" dbtype="Query">
SELECT
ID
FROM MyQoQ
WHERE NAME LIKE '%#_myvar#%'
OR DESCRIPTION LIKE '%#_myvar#%'
</cfquery>
我试过 PreserveSingleQuotes()
以及用 CFQUERYPARAM
包装变量,但是没有用 - 我得到了相同的结果。
有没有办法让它工作?
添加一个重现案例
<cfset myQuery = queryNew('hello')>
<cfset queryAddRow(myQuery,5)>
<cfset querySetCell(myQuery,"hello","what up",1)>
<cfset querySetCell(myQuery,"hello","what's up",2)>
<cfset querySetCell(myQuery,"hello","what's up friends",3)>
<cfset querySetCell(myQuery,"hello","what u",4)>
<cfset querySetCell(myQuery,"hello","what",5)>
<cfdump var="#myQuery#">
<cfquery name="res" dbtype="query">
SELECT *
FROM myQuery
WHERE hello LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%$what's up%">
</cfquery>
<cfdump var="#res#">
Railo 4.1.1.009 - 返回两个结果(第 2 行和第 3 行) ColdFusion 10,0,13,287689 - 不返回任何结果 如果我将 SQL 更改为
WHERE hello LIKE '%what''s up%'
还是没有结果
最佳答案
啊!!后方皇家痛苦的经典案例。
要解决这个问题,您必须在搜索词中的每个 ' 中添加一个额外的 ',然后将其转义。
<cfset myQuery = queryNew('hello')>
<cfset queryAddRow(myQuery,5)>
<cfset querySetCell(myQuery,"hello","what up",1)>
<cfset querySetCell(myQuery,"hello","what's up",2)>
<cfset querySetCell(myQuery,"hello","what's up friends",3)>
<cfset querySetCell(myQuery,"hello","what u",4)>
<cfset querySetCell(myQuery,"hello","what",5)>
<cfdump var="#myQuery#">
<cfset x = "what's up" />
<cfquery name="res" dbtype="query">
SELECT *
FROM myQuery
WHERE hello LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="#replace(x, "'", "''", "all")#%">
</cfquery>
<cfdump var="#res#">
如果你像你提到的那样直接这样做,
WHERE hello LIKE '%what''s up%'
解析器快崩溃了。但是,如果您通过函数返回值传递值,则通过变量在运行时赋值会以某种方式让解析器满意。
我记得在发送多个用“;”分隔的 SQL 语句时使用了这些技巧在查询中。直接写
"DECLARE x NUMBER; SELECT 2 INTO x FROM DUAL;"
在 cfquery 内部失败,但将它们分配给一个字符串,然后将该字符串作为任何字符串操纵器函数(lcase、ucase 等)的返回值发送,效果很好。
注意:问题已解决,但如果我的解释和方法有差异,欢迎指正和评论。
关于ColdFusion Query-of-Queries Wildcard LIKE 条件不适用于单引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22468983/