【问题标题】:HSQLDB / Oracle - more than 1000 items in IN clauseHSQLDB / Oracle - IN 子句中超过 1000 项
【发布时间】:2014-10-30 02:06:09
【问题描述】:

我们在数据库中有很多数据,有时我们需要在 IN 子句中调用超过 1000 项的 sql 语句。我知道应该重构那些 sql 语句,并且 IN 子句不应该有那么多项目,但有时关注每个 sql 查询并不容易。所以我有几个问题。

  1. 解决此问题的可能性有哪些?我发现了几个:
    • 重构 sql 语句 - 并不总是那么容易
    • 为项目创建临时表,因此 IN 子句将如下所示 ... IN (SELECT id from temptable) - 可能是个好主意
    • IN 子句分成几个IN 子句,如... id IN (...) or id IN (...)
  2. Oracle db 对 IN 子句有限制,但我没有找到我们用于单元测试的 HSQLDB 的限制。是否可以通过 HSQLDB 中的某种配置或其他方式设置此限制?
  3. 关于 IN 子句的临时表 - 如何使用 HQL 创建临时表(我们在应用程序中使用 Hibernate 4.2)?有可能吗?
  4. 目前一些IN 子句不会超过1000 个项目,因为我们在db 中没有那么多数据。但是在应用程序开始生产后(它仍处于开发过程中)将会有更多的数据,因此我们希望为此做好准备。

您对这个问题有什么经验。你是怎么解决的?

关于我们环境的详细信息:

  • 休眠 4.2
  • HSQLDB 2.3.2
  • 甲骨文 11g

【问题讨论】:

  • 另一个很好的例子说明为什么使用不同的 DBMS 进行(单元)测试是个坏主意

标签: sql hibernate jpa oracle11g hsqldb


【解决方案1】:

我认为问题 1 已经回答了很多,但这里有一个来自Oracle Community 的优雅解决方案的链接。

基本上,您创建一个表格类型和一个将逗号分隔的字符串转换为表格的函数。这允许您连接到返回的表数据。

以下是我们为逗号分隔的数字/ID 列表实现的方法:

 create or replace function in_number_list (in_list in varchar2)  --send string
 return num_table                                      --return table of numbers
 as
 l_tab   num_table := num_table();           -- blank table
 l_text  varchar2(32767) := in_list || ',';  -- passed string + extra ','
 l_idx   number;                             -- a counter

 begin
 loop
   l_idx := instr(l_text, ',');              -- find the first comma position
   exit when nvl(l_idx,0) = 0;               -- if no more, break out of loop
   l_tab.extend;                             -- add a new row to table
   l_tab(l_tab.last) := to_number(trim(substr(l_text,1,l_idx-1)));
                                        -- add entry to table based on number
                                        -- split from string 
   l_text := substr(l_text,l_idx+1);         -- reset the original string
                                        -- trimming off what we've processed
 end loop;
 return l_tab;                               -- send back table of numbers
 end;

【讨论】:

    【解决方案2】:

    关于问题2,HSQLDB对IN子句中的项数没有限制,也没有限制。

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2010-09-28
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2018-11-20
      • 2013-03-30
      • 1970-01-01
      相关资源
      最近更新 更多