2017-11-08 11 views
0

테이블을 고려 곳에서 하이픈 열 :오라클 - 절

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

이 테이블을 많이 업데이트하지 않으면 하나 이상의 국가 코드가있는 COUNTRY_CODE에 대한 중복 레코드를 생성하는 Materialized View를 생성 할 수 있습니다. 이렇게하면 성능을 향상시키기 위해 like를 사용하지 않아도됩니다. – STaefi

+0

@STaefi 테이블에 수백만 개의 레코드가 포함되어 있으며 테이블이 계속 커집니다. 중복은 실제로 여기 옵션이 아닙니다. – HitchHiker

답변

0

목록을 구분 된 문자열로 저장하지 마십시오.

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; 

당신이 만약 사용할 수 있습니다

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; 

를 사용하거나 중첩 테이블을 사용할 수 있습니다 중 하나를 별도의 테이블을 생성 구분 된 문자열을 사용해야합니다. 당신이 더 이상 목록 요소가있는 경우 다음 %cd%cd 또는 cda 또는 bbcdbb 일치 수, 그렇지 않으면

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

: 스피는 검색 식의 구분 기호를 포함해야한다.

+0

응답 해 주셔서 감사합니다. 첫 번째 방법은 다른 테이블에있는 모든 (id, country_code) 조합에 대한 항목을 만드는 것입니다. 메인 테이블의 크기 때문에 적당하지 않은 것으로 보입니다. 두 번째 방법은 이미 질문에서 언급했듯이 작업 비용을 엄청나게 증가시킵니다. – HitchHiker