2017-11-08 23 views
0

でハイフンの列は、テーブルを考えてみましょう:オラクル - where句

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の重複レコードを作成できます。このように、likeを使用してパフォーマンスを向上させることは避けられます。 – STaefi

+0

@STaefiテーブルには何百万ものレコードが含まれています。だから複製は本当にここでの選択肢ではありません。 – HitchHiker

答えて

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; 

を使用することができます区切られた文字列を使用しなければならないあなたが長いリストの要素を持っているならば、%cd%cdまたはcdaまたはbbcdbbと一致する可能性があり、そうでなければ

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

:ryは、検索式の区切り文字を含める必要があります。

+0

ありがとうございました。第1のアプローチは、すべての(id、country_code)組み合わせのエントリを別のテーブルに作成することを意味します。これはメインテーブルのサイズのためにはお勧めできません。 2番目のアプローチは、すでに質問したように、運用コストを大幅に増加させます。 – HitchHiker