3

変数文字列に対して LIKE 条件を実行するクエリのクエリがあります。

変数に一重引用符を含む単一の単語が含まれている場合、一部の結果が返されますが、すべてではありません。

<cfset _myVar = "Women's" />

<cfquery name="_qData" dbtype="Query">
    SELECT 
        ID
    FROM   MyQoQ
    WHERE  NAME LIKE '%#_myvar#%'
        OR DESCRIPTION LIKE '%#_myvar#%'
</cfquery>

変数に複数の単語が含まれ、それらの単語の 1 つに一重引用符が含まれている場合、レコードは返されません。

<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%'

まだ結果が出ない

4

2 に答える 2

1

ColdFusion 10 u13 を実行しています。

レポコードを変更すると、これはうまくいくように見えました:

<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>

<cfqueryparam> タグの二重引用符に注意してください。Dan のように、<cfqueryparam> タグがこれを自動的に処理してくれると思っていたでしょう。おそらくこれはQoQのバグですか?

于 2014-03-18T07:11:54.457 に答える
1

ああ!! 後部の王室の痛みの典型的なケース。

これを解決するには、検索語のすべてに ' を追加し、エスケープする必要があります。

<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ステートメントを送信する際に、このようなトリックを使用したことを覚えています。cfquery で。直接書く

"DECLARE x NUMBER; SELECT 2 INTO x FROM DUAL;" 

内部 cfquery は失敗しますが、それらを文字列に割り当ててから、文字列操作関数 (lcase、ucase など) の戻り値として文字列を送信すると、完全に機能しました。

注:問題は解決しましたが、私の説明とアプローチが異なる場合は、自由に修正してコメントしてください。

于 2014-03-18T06:23:41.810 に答える