2017-11-18 2 views
1

は、ここで私が必要とするデータが解析されます。私はそれらを試してみて、分離するために、このアプローチを試してみましたが、この意志文字列を取る方法、小数点以下を小数点以下に変換する方法、文字列の一部を抽出してテーブルと比較する方法はありますか?

--Table: MATERIALS 
--COLUMN: VARCHAR2(20) 

ITEM_ID 
-------------- 
1/2 X 3-1/2 
5/16 X 4-1/2 
1/8 X 2-1/2 

:ここ

--TABLE: PRICE_LIST 


ITEM_DESCRIPTION VARCHAR2(60) VENDOR_PARTNO VARCHAR2(15) 
---------------------------- -------------------------- 
.374 x 3 w/ph KLT-6   5506125 
.4375 x 3-1/2 w/ph KLT-3345 5506124 
.125 x 2-1/2 w/ph KLT-3211  5506123 
.3125 x 4-1/2 w/ph KUR-44  5506127 

は私がPRICE_LIST.ITEM_DESCRIPTIONを比較する必要があるテーブルです多くの作業が必要です。

SELECT SUBSTR(VALUE, 1, INSTR(VALUE, 'x')-1) DIAMETER, 
     SUBSTR(VALUE, INSTR(VALUE, 'x')+1) DIRTY_LENGTH 
     FROM (SELECT DESCRIPTION VALUE FROM PRICE_LIST); 

DIAMETER DIRTY_LENGTH 
-------- ------------ 
.374  3 w/ph KLT-6 
.4375  3-1/2 w/ph KLT-3345 
.125  2-1/2 w/ph KLT-3211 
.3125  4-1/2 w/ph KUR-44 

をしかし、今、私は私が何をするか分からない小数と列、および私の第二の部分を持っている別の列を持っていますが、私が必要としない他のデータ。

PRICE_LISTテーブル内の唯一の最後の2つの値が一致しているので、私が欲しいのはこれだけを返すことです。助けを

ITEM_DESCRIPTION VENDOR_PARTNO 
---------------- ------------- 
1/8 X 2-1/2  5506123 
5/16 X 4-1/2  5506127 

ありがとう!

+0

は、なぜあなたは、このようなひどく設計されたデータを使用していますか?間違った形式のデータや不適切な文字列の解析や比較をするのではなく、一致させるために使用できる主キーが必要です。基本的なデータベース設計の原則について、本を購入したり、Webチュートリアルを探したりすることもできます。 –

+0

説明の最初の部分のように、直径(.125 == 1/4など)に対応しているようです。そして、はい、データを構造化する必要があります。現在、理解して使用することは非常に困難です。 – igr

+1

@KenWhite - OPの具体的な状況はわかりません。しかし、これが既存のデータである状況を想像することができます。以前のIT担当者がどれだけ愚かなのか(データモデルを見て)、それらの無能な人をどれだけ吹き飛ばしたのか、混乱を扱う?もちろん、データモデルなどを修正してください。どうしたらいいですか? OPが求めていることを** **正確に**行う必要はありませんか?そして、あなたが助けが必要な場合は、ここで質問しませんか? – mathguy

答えて

1

データ形式はひどいです。この例のように行い、その後

CREATE OR REPLACE FUNCTION evaluate_me(p_x VARCHAR2) 
RETURN NUMBER 
DETERMINISTIC 
IS 
    x VARCHAR2(200); 
    expr VARCHAR2(100); 
    y NUMBER; 
BEGIN 
    x := lower(substr(p_x, 1, regexp_instr(p_x ||'q', '[^.0-9 xX\/\-]+')-1)); 
    expr := replace('BEGIN :p:='|| x ||'; END;', 'x', '*'); 
    execute immediate expr USING OUT y; 
    RETURN y; 
END; 
/

と:あなたはこれらの式を評価するdefinied PL/SQLファンクションのカスタムユーザーを作成する必要がありそうですhttp://sqlfiddle.com/#!4/c7681/2

select p.*, evaluate_me(item_description) x 
from PRICE_LIST p; 

|   ITEM_DESCRIPTION | VENDOR_PARTNO |  X | 
|-----------------------------|---------------|--------| 
|   .374 x 3 w/ph KLT-6 |  5506125 | 1.122 | 
| .4375 x 3-1/2 w/ph KLT-3345 |  5506124 | 0.8125 | 
| .125 x 2-1/2 w/ph KLT-3211 |  5506123 | -0.25 | 
| .3125 x 4-1/2 w/ph KUR-44 |  5506127 | 0.75 | 

select m.*, evaluate_me(item_id) x 
from MATERIALS m 
; 
|  ITEM_ID |  X | 
|--------------|-------| 
| 1/2 X 3-1/2 |  1 | 
| 5/16 X 4-1/2 | 0.75 | 
| 1/8 X 2-1/2 | -0.25 | 

SELECT * 
FROM PRICE_LIST p 
JOIN MATERIALS m 
ON evaluate_me(p.item_description) = evaluate_me(m.item_id) 
; 

|   ITEM_DESCRIPTION | VENDOR_PARTNO |  ITEM_ID | 
|----------------------------|---------------|--------------| 
| .125 x 2-1/2 w/ph KLT-3211 |  5506123 | 1/8 X 2-1/2 | 
| .3125 x 4-1/2 w/ph KUR-44 |  5506127 | 5/16 X 4-1/2 | 

これは極端に遅くなることが予想されます。 e関数は、左テーブルの各行に対して、次に右テーブルの各行に対して呼び出されます。したがって、左側の表に10,000行、右側の表に20,000行(RDBMSシステムではあまりない)がある場合、その関数は10,000 + 10,000 * 20,000 = 200,010,000回と呼ばれます。
データは、First Normal Formのルールに従わず、アクセスごとに解析する必要があります。より高速なクエリを作るために

あなたはあなたが毎月の休暇に行くことができ、このクエリを起動したときにそれ以外の場合は、二つの機能インデックスを作成する必要があります。

CREATE INDEX MATERIALS_eval ON MATERIALS(evaluate_me(ITEM_ID)); 

CREATE INDEX PRICE_LIST_eval ON PRICE_LIST(evaluate_me(ITEM_DESCRIPTION)); 
+0

これを投稿していただきありがとうございます。私は明日これを事務所でテストし、中継し直します。私はデータが完全に混乱していることに同意します。それはあまり設計されず、このように15年間維持されました。 – Delbudge

関連する問題