ColdFusion Query-of-Queries Wildcard LIKE 条件不适用于单引号?

标签 coldfusion coldfusion-8 sql-like cfquery qoq

我有一个对可变字符串执行 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/

相关文章:

postgresql - 在 CF Administrator 中管理证书

Javascript+mysql "simple quote"

sql - 如何使用通配符 (LIKE) 和数组 (IN) 进行选择?

javascript - Coldfusion 中提交的表单会发生什么?

file-upload - 在 ColdFusion 8 中,如何确定文件上传是否是有效的 CSV 文件(或至少是文本)?

sql - 为什么 ColdFusion 哈希函数在这些场景中会返回不同的结果?

php - 使用 PostgreSQL 和 PHP 的 "LIKE"的好的替代/实践?

regex - Coldfusion RegEx 检查密码强度

performance - 证明coldfusion函数在输出=true时不必要地缓冲

java - RequestDispatcher.forward 到媒体文件?