0

我正在尝试构建一个针对我们组具有读取访问权限的 Oracle 数据库运行的查询,该查询会下拉结果以在我们控制的本地副本中插入和修改。我已经建立了查询,但遇到了一个小问题。要返回查询结果,由于数据库的索引方式,我不能使用 BETWEEN;使用日期范围会导致它运行得太慢,并且 PK 不会按顺序递增。相反,我必须遍历一组值并将它们与 PK 匹配。

通常,对于像这样针对 SQL 服务器的事情,我会向它抛出这样的东西:

AND ( 
    1=1
    <cfloop array="#orderHeaderNumArray#" index="i">
        OR TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
    </cfloop>
)

但是,每次我对 Oracle 查询尝试 1=1 时,总是会收到 UTF-8 错误。过去,我只是通过将已知不存在的值设置为条件来对解决方案进行了一半的评估,但我想知道 #1 这是 Oracle 限制还是 CF 限制,如果有更好的 #2沿着始终为真而不是始终为假的条件的解决方案。

编辑:服务器是 CF10,但我不知道我们使用的是什么版本的 Oracle。

4

2 回答 2

2
AND ( 
  1=1
  <cfloop array="#orderHeaderNumArray#" index="i">
     OR TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
  </cfloop>
  )

Does not work in Oracle or ColdFusion. Consider

AND ( 
  1=0
  <cfloop array="#orderHeaderNumArray#" index="i">
     OR TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
  </cfloop>
  )

If you are really concerned about the performance of 1=0

AND ( 
  <cfloop array="#orderHeaderNumArray#" index="i">
     <cfif i NEQ orderHeaderNumArray[1]> OR </cfif> TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
  </cfloop>
  )
于 2013-09-20T14:58:53.873 回答
0

我同意使用 1 = 1 不太理想,但我认为只要您包含关于它为什么存在的评论,它是可以接受的。

但是,更重要的是问题 - 您是否尝试过将主键分配给自身?IE

AND ( 
    id = id
    <cfloop array="#orderHeaderNumArray#" index="i">
        OR TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
    </cfloop>
)
于 2013-09-21T11:29:00.473 回答