Oracle - where子句中的连字符列

时间:2017-11-08 10:24:17

标签: java oracle where-clause

考虑一个表:

ID  COUNTRY_CODE
1   ab-cd-ef
2   gh-ef
3   cd-ab-pq-xy

我需要一个sql查询来选择包含特定国家/地区代码的记录。 传统的LIKE方法当然有效:

select ID from TableName where COUNTRY_CODE like '%cd%';

这里的问题是,此查询将运行数百万条记录,从而增加了总操作的成本。由于成本问题,嵌套表不是一个选项。

注意:如果需要,可以使用Java对查询进行参数化。

处理此类可搜索列是否有任何经济有效的方法?

1 个答案:

答案 0 :(得分:0)

不要将列表存储为分隔字符串。创建一个单独的表:

CREATE TABLE TableName ( id NUMBER PRIMARY KEY );

CREATE TABLE TableName__Country_Codes(
  id           NUMBER REFERENCES table_name ( id ),
  country_code CHAR(2),
  PRIMARY KEY ( id, country_code )
);

然后你可以使用

SELECT ID
FROM   TableName__Country_codes
WHERE  'cd' = COUNTRY_CODE;

或使用嵌套表:

CREATE TYPE Char2List IS TABLE OF CHAR(2)
/

CREATE TABLE TableName(
  ID NUMBER PRIMARY KEY,
  Country_Code Char2List
) NESTED TABLE Country_code STORE AS Table_Name__Country_Codes;

然后你可以使用

SELECT ID
FROM   TableName
WHERE  'cd' MEMBER OF COUNTRY_CODE;

如果必须使用分隔字符串,则查询应在搜索表达式中包含分隔符:

SELECT ID
FROM   TableName
WHERE  '-' || COUNTRY_CODE || '-' like '%-cd-%';

否则,如果您有更长的列表元素,则%cd%可以匹配cdcdabbcdbb