2017-10-12 42 views
0

信息:我使用的Oracle 11gORACLE SQL:最短查詢,除去最後一組支架的

比方說這是樣本數據:

Lemon(USD4)(RM16)(SG8) 
Melon(RM40)(SG20)(USD10)(EU5) 
Orange(USD7)(RM28) 
Apple(USD2) 
Grape 

我想替換最後一個支架組(如果任何)以產生:

Lemon(USD4)(RM16) 
Melon(RM40)(SG20)(USD10) 
Orange(USD7) 
Apple 
Grape 

 

這是我的兩個SQL中這似乎太長:

SELECT 
    CASE 
     WHEN REGEXP_COUNT(FOOD, '\(') = 0 THEN FOOD 
     ELSE SUBSTR(FOOD, 1, INSTR(FOOD, '(', -1)-1) 
    END 
FROM TABLE_A; 
SELECT 
    DECODE(
     REGEXP_COUNT(FOOD, '\('), 0, 
     FOOD, 
     SUBSTR(FOOD, 1, INSTR(FOOD, '(', -1)-1) 
    ) 
FROM TABLE_A; 

 

我尋求短。大概是這樣的:

SELECT REGEXP_REPLACE(FOOD, '\(what_is_here\)', '', 1, 2) FROM TABLE_A; 

回答

1

嘗試\([^\)]*\)$模式:

SELECT t.*, 
    REGEXP_REPLACE(food, '\([^\)]*\)$', '') as xxx 
from table1 t 

現場演示:http://sqlfiddle.com/#!4/1188b/19

|       FOOD |      XXX | 
|-------------------------------|--------------------------| 
|  Lemon(USD4)(RM16)(SG8) |  Lemon(USD4)(RM16) | 
| Melon(RM40)(SG20)(USD10)(EU5) | Melon(RM40)(SG20)(USD10) | 
|   Orange(USD7)(RM28) |    Orange(USD7) | 
|     Apple(USD2) |     Apple | 
|       Grape |     Grape | 
+0

太謝謝你了!它按預期工作。這很難理解。 「\(」緊隨括號後面的數字,我認爲必須有。*在開始和結束括號之間 – Coisox

+0

再次閱讀後,我發現你使用[^ \]] *而不是*。 – Coisox