在SQL数据库字段中存储可搜索数组

时间:2018-08-06 08:46:00

标签: java sql sql-server oracle postgresql

目前,我尝试解决以下问题: 我正在使用的文档管理软件可以为那里的文档定义掩码,每个掩码都有一个或多个索引字段(类型:字符串)。系统支持以下数据库:

  1. Postgres 2. ORACLE 3. Microsoft SQl 4. DB2

现在,如果可以将字符串数组仅存储在sql数据库的一个字段中,以便每个掩码仅占用sql表中的一行,那么我应该进行研究。 另一个要求是可以通过sql搜索该数组。

结果应该是sql数据库不像现在这样分散,因为每个索引字段都是掩码定义中的一列,而且在性能方面,结果应该相等(或者可能更快)。

当前状态是,我有一些postgres(但到目前为止仅使用Double [])和ORACLE(通过ArrayDouble类型)的工作示例,结果很好(没有碎片并且性能得到了提高(> 200%))。这些示例使用Java(标准jdbc连接)编写。

对于DB2,我找到了一些有关普通数组(和其他两种类型)的文档,但是无法构建有效的示例,对于Microsoft SQL,我找不到任何暗示它内置了数组功能的提示。

所以我的主要问题是,你们是否有解决此问题的经验,并且可以就如何解决此问题特别向我提供有关DB2和Microsoft SQL的建议。另外,如果您对Postgres和/或Oracle有很棒的解决方案,请与我分享您的知识。 :)

在此先感谢您:)祝大家星期一星期一愉快:) 问候帕斯卡

1 个答案:

答案 0 :(得分:1)

使用Oracle,您可以使用NESTED TABLE s(或VARRAY s)将数组存储在列中:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TYPE String_Table IS TABLE OF VARCHAR2(100)
/

CREATE TABLE test (
  id     NUMBER(10,0),
  col1   VARCHAR2(10),
  array1 String_Table
) NESTED TABLE array1 STORE AS test__array1
/

INSERT INTO test ( id, col1, array1 )
  SELECT 1, 'Row1', String_Table( 'A', 'B', 'C' ) FROM DUAL UNION ALL
  SELECT 2, 'Row2', String_Table( 'C', 'D', 'E' ) FROM DUAL
/

查询1 :然后,您可以使用诸如MEMBER OF之类的集合操作来查找集合中的项目;和MULTISET之类的SUBMULTISET OF运算符来查找包含另一个集合的所有项目的集合。

SELECT *
FROM   test
WHERE  'B' MEMBER OF array1
OR     String_Table( 'E', 'C' ) SUBMULTISET OF array1

Results

| ID | COL1 | ARRAY1 |
|----|------|--------|
|  1 | Row1 |  A,B,C |
|  2 | Row2 |  C,D,E |

如果您正在使用Java,则可以将Java数组作为PreparedStatementCallableStatement的绑定参数进行传递。 herehere这样的例子。