通过ColdFusion更改查询模式以允许IN而不是等于

时间:2015-02-24 14:26:50

标签: coldfusion

我试图通过ColdFusion更改查询的某些内容。好吧,我不能尝试查询本身因为我从外部来源获取查询

我有以下查询

(q.company_na = 'a, b, c, d') 

我试图将其转换为

(q.company_na in ('a, b, c, d')) 

我正在使用正常替换,但这不会解决问题。我看过我的尝试是这样的

<cfset data = Replace(data,'q.company_na = ','q.company_na IN ','ALL')>

但是我错过了IN周围的开口和收尾支架。我该如何处理?

3 个答案:

答案 0 :(得分:2)

查询参数的另一个好处

 where q.company_na in (
<cfqueryparam cfsqltype="cf_sql_char" value="a,b,c,d" list="yes">
)

答案 1 :(得分:0)

在Dan的回答中播放riff,您可以向查询对象添加参数。

  1. 在查询中查找所有相等运算符。
  2. 找到每个相等运算符,
    1. 将右侧存储为临时变量。
    2. 将等号运算符和右侧替换为IN (?)
    3. 使用存储在临时变量中的值,将参数添加到查询对象(query.addParam(...),请参阅query object documentation)。
      • 确保从列表分隔符周围删除空格。
      • 确保将参数的list属性设置为true
  3. 使用修改后的SQL设置查询对象的sql属性。

答案 2 :(得分:0)

你能尝试这样的事吗?

<cfset str = "(q.company_na = 'a, b, c, d')" />
<cfset str = REReplace(str, "(,)\s*", "'\1'", "all") />
<cfset str = REReplace(str, "= ('[^)]*)", "IN (\1)") />

输出:

(q.company_na IN ('a','b','c','d'))

如果您希望输出

(q.company_na in ('a, b, c, d'))

(我无法想象你这样做,因为这在语义上与在这个例子中使用=相同),然后简单地省略上面的第二行并执行此操作:

<cfset str = "(q.company_na = 'a, b, c, d')" />
<cfset str = REReplace(str, "= ('[^)]*)", "IN (\1)") />