在搜索之前获得额外的 OR
getting an extra OR before the search
我有这个查询,我在 AND 子句后得到一个额外的 OR,搜索失败
<cfset CountVar = 1>
<cfquery name="qFiltered">
SELECT id,name,email,useris,roleid
FROM users
WHERE 1=1
<cfif search NEQ "">
AND (
<cfloop list="#aColumnArray#" index="sSearch">
<cfif CountVar NEQ countOfColumns> OR </cfif>
#sSearch# LIKE <cfqueryparam value="%#search#%" cfsqltype="cf_sql_varchar" />
<cfset CountVar += 1>
</cfloop>
)
</cfif>
</cfquery>
计数器有问题,它没有验证 countofColumns 的数量
<cfset var countOfColumns = listLen(aColumnArray)>
这个怎么样
<cfquery name="qFiltered">
SELECT id,name,email,useris,roleid
FROM users
WHERE 1 = 1
<cfif search NEQ "">
AND (
0 = 1
<cfloop list="#aColumnArray#" index="sSearch">
OR
[#sSearch#] LIKE <cfqueryparam value="%#search#%" cfsqltype="cf_sql_varchar" />
</cfloop>
)
</cfif>
</cfquery>
这里的基本逻辑是在第一个条件之后为所有 WHERE 条件添加 OR
:
<cfset CountVar = 1>
<cfloop list="#aColumnArray#" index="sSearch">
<cfif CountVar gt 1> OR </cfif>
#sSearch# LIKE <cfqueryparam value="%#search#%" cfsqltype="cf_sql_varchar" />
<cfset CountVar++>
</cfloop>
第一次迭代没有OR,所有后续迭代前面都有OR。
顺便说一句:带有前导通配符的 LIKE 不能使用索引,并且会导致性能不佳。考虑全文索引。
我有这个查询,我在 AND 子句后得到一个额外的 OR,搜索失败
<cfset CountVar = 1>
<cfquery name="qFiltered">
SELECT id,name,email,useris,roleid
FROM users
WHERE 1=1
<cfif search NEQ "">
AND (
<cfloop list="#aColumnArray#" index="sSearch">
<cfif CountVar NEQ countOfColumns> OR </cfif>
#sSearch# LIKE <cfqueryparam value="%#search#%" cfsqltype="cf_sql_varchar" />
<cfset CountVar += 1>
</cfloop>
)
</cfif>
</cfquery>
计数器有问题,它没有验证 countofColumns 的数量
<cfset var countOfColumns = listLen(aColumnArray)>
这个怎么样
<cfquery name="qFiltered">
SELECT id,name,email,useris,roleid
FROM users
WHERE 1 = 1
<cfif search NEQ "">
AND (
0 = 1
<cfloop list="#aColumnArray#" index="sSearch">
OR
[#sSearch#] LIKE <cfqueryparam value="%#search#%" cfsqltype="cf_sql_varchar" />
</cfloop>
)
</cfif>
</cfquery>
这里的基本逻辑是在第一个条件之后为所有 WHERE 条件添加 OR
:
<cfset CountVar = 1>
<cfloop list="#aColumnArray#" index="sSearch">
<cfif CountVar gt 1> OR </cfif>
#sSearch# LIKE <cfqueryparam value="%#search#%" cfsqltype="cf_sql_varchar" />
<cfset CountVar++>
</cfloop>
第一次迭代没有OR,所有后续迭代前面都有OR。
顺便说一句:带有前导通配符的 LIKE 不能使用索引,并且会导致性能不佳。考虑全文索引。