有没有一种优雅的方法可以根据列表的值动态生成查询?

时间:2012-03-07 17:16:07

标签: loops coldfusion

我已经创建了这个有效的代码,并且做了我想要它做的事情,但是我想知道是否有更好的更聪明的方法来做到这一点。这是代码:

<cfset myList = ValueList(qSeminarWisReg.SeminarWisTitle,",")>

<cfif ListLen(myList,",") lte 1>
  <cfquery datasource="#APPLICATION.dataSource#" name="qSeminarWisRegTwo">
  SELECT * FROM SeminarWis
  WHERE SeminarWisID = <cfqueryparam value="#myList#" cfsqltype="cf_sql_integer">
  </cfquery>
<cfelse>
  <cfquery datasource="#APPLICATION.dataSource#" name="qSeminarWisRegTwo">
  SELECT * FROM SeminarWis
  WHERE 0 = 0
    AND (SeminarWisID  = <cfqueryparam value="100000000" cfsqltype="cf_sql_integer">
    <cfloop index = "x" list = "#myList#" delimiters = ","> OR SeminarWisID  = #x#</cfloop>)
  </cfquery>
</cfif>

基本上我有一个动态生成的列表,其中包含数字,用逗号分隔。现在这些数字对应于表中的唯一键,因此我只是动态地抓取用户想要的所有行。

就像我说的,这有效,但如果有人有任何关于如何让这更好的提示让我知道!困扰我的部分是我必须使用“1000000”值(一个不存在的值)才能进入OR语句。

1 个答案:

答案 0 :(得分:10)

我认为你想使用带有list =“true”的CFQUERYPARAM和IN运算符:

SELECT * 
FROM   SeminarWis
WHERE  SeminarWisID IN ( 
          <cfqueryparam value="#myList#" cfsqltype="cf_sql_integer" list="true" /> 
       )

请注意,这仅适用于listLen(myList)GTE 1