我從我發表的另一篇文章中得到了這個查詢,該文章用于REGEXP_SUBSTR()從 oracle 中的字串中提取特定資訊。它作業得很好,但僅適用于小資料集。當涉及具有 300,000 多條記錄的表時,它非常慢,而且我正在閱讀 instr substr 可能更快。示例查詢是:
SELECT REGEXP_SUBSTR(value, '(^|\|)\s*24=\s*(.*?)\s*(\||$)', 1, 1, NULL, 2) AS "24",
REGEXP_SUBSTR(value, '(^|\|)\s*35=\s*(.*?)\s*(\||$)', 1, 1, NULL, 2) AS "35",
REGEXP_SUBSTR(value, '(^|\|)\s*47A=\s*(.*?)\s*(\||$)', 1, 1, NULL, 2) AS "47A",
REGEXP_SUBSTR(value, '(^|\|)\s*98A=\s*(.*?)\s*(\||$)', 1, 1, NULL, 2) AS "98A"
FROM table_name
表示例:
CREATE TABLE table_name (value ) AS
SELECT '35= 88234.00 | 47A= Shawn | 98A= This is a comment |' FROM DUAL UNION ALL
SELECT '24= 123.00 | 98A= This is a comment | 47A= Derick |' FROM DUAL
查詢的輸出將是:
| 24 | 35 | 47A | 98A |
|---|---|---|---|
| 88234.00 | 肖恩 | 這是一條評論 | |
| 123.00 | 德里克 | 這是一條評論 |
有人可以舉個例子說明如果我用 instr substr 代替,這個相同的查詢會是什么樣子嗎?
謝謝你。
uj5u.com熱心網友回復:
SELECT CASE
WHEN start_24 > 0
THEN TRIM(
SUBSTR(
value,
start_24 5,
INSTR(value, '|', start_24 5) - (start_24 5)
)
)
END AS "24",
CASE
WHEN start_35 > 0
THEN TRIM(
SUBSTR(
value,
start_35 5,
INSTR(value, '|', start_35 5) - (start_35 5)
)
)
END AS "35",
CASE
WHEN start_47a > 0
THEN TRIM(
SUBSTR(
value,
start_47a 6,
INSTR(value, '|', start_47a 6) - (start_47a 6)
)
)
END AS "47A",
CASE
WHEN start_98a > 0
THEN TRIM(
SUBSTR(
value,
start_98a 6,
INSTR(value, '|', start_98a 6) - (start_98a 6)
)
)
END AS "98A"
FROM (
SELECT value,
INSTR(value, '| 24=') AS start_24,
INSTR(value, '| 35=') AS start_35,
INSTR(value, '| 47A=') AS start_47a,
INSTR(value, '| 98A=') AS start_98a
FROM (
SELECT '| ' || value AS value FROM table_name
)
);
其中,對于您的樣本資料,輸出:
24 35 47A 98A 88234.00 肖恩 這是一條評論 123.00 德里克 這是一條評論
db<>在這里擺弄
uj5u.com熱心網友回復:
鑒于您示例中的資料,您似乎也可以使用程式方法來提取資料,但我懷疑這是否會更快。
get24例如,以下函式僅使用INSTRand提取列“24” SUBSTR。
CREATE OR REPLACE FUNCTION get24(value IN VARCHAR2) RETURN VARCHAR2
IS
i PLS_INTEGER;
s VARCHAR2(32767);
BEGIN
i := INSTR(value, '24= ');
IF (i <> 1) THEN
RETURN NULL;
END IF;
s := SUBSTR(value, i 4);
i := INSTR(s, ' | ');
IF (i = 0) THEN
RETURN NULL;
END IF;
RETURN SUBSTR(s, 1, i - 1);
END;
/
SELECT get24(value) "24" FROM table_name;
然后,您還可以嘗試使用流水線函式并在流水線函式內進行所有資料提取。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/349012.html
