为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

12345678_0001 2021-06-15 13:38:33
目前我尝试解决以下问题:我正在使用的文档管理软件可以为那里的文档定义掩码,并且每个掩码都有一个或多个索引字段(类型:字符串)。系统支持以下数据库: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 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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


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

结果:


| ID | COL1 | ARRAY1 |

|----|------|--------|

|  1 | Row1 |  A,B,C |

|  2 | Row2 |  C,D,E |

如果您使用的是 Java,那么您可以将 Java 数组作为 aPreparedStatement或 的绑定参数传递CallableStatement。这方面的一些例子是here和here。


查看完整回答
反对 回复 2021-06-30
  • 1 回答
  • 0 关注
  • 181 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信