考虑一个表:
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对查询进行参数化。
处理此类可搜索列是否有任何经济有效的方法?
答案 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%
可以匹配cd
或cda
或bbcdbb
。