Home » SQL & PL/SQL » SQL & PL/SQL » Remove all entries except last one (Oracle Database 11.2.0.3 Enterprise Edition)
Remove all entries except last one [message #612147] |
Sun, 13 April 2014 11:56 |
manubatham20
Messages: 566 Registered: September 2010 Location: Seattle, WA, USA
|
Senior Member |
|
|
Hi,
I have to remove all entries of 'BARPAYG' in below piped strings except last one.
WITH temp AS (SELECT 'BARPAYG|BARPAYG|PROTECT' col FROM DUAL
UNION
SELECT 'BARPAYG|ILDPPMRC' col FROM DUAL
UNION
SELECT 'BARPAYG|BARPAYG' col FROM DUAL
UNION
SELECT 'BARPAYG|ILDPPMRC|BARPAYG' col FROM DUAL
UNION
SELECT 'BARPAYG' col FROM DUAL
UNION
SELECT 'BARPAYG|ILDPPMRC|BARPAYG|GIGMRC' col FROM DUAL)
SELECT *
FROM temp;
Result should be like:
BARPAYG|PROTECT
BARPAYG|ILDPPMRC
BARPAYG
ILDPPMRC|BARPAYG
BARPAYG
ILDPPMRC|BARPAYG|GIGMRC
I am poor with REGEX, please help me to do that.
Manu
|
|
|
|
|
|
Re: Remove all entries except last one [message #612153 is a reply to message #612151] |
Sun, 13 April 2014 12:52 |
|
Michel Cadot
Messages: 68645 Registered: March 2007 Location: Nanterre, France, http://...
|
Senior Member Account Moderator |
|
|
SQL> WITH temp AS (SELECT 'BARPAYG|BARPAYG|PROTECT' col FROM DUAL
2 UNION
3 SELECT 'BARPAYG|ILDPPMRC' col FROM DUAL
4 UNION
5 SELECT 'BARPAYG|BARPAYG' col FROM DUAL
6 UNION
7 SELECT 'BARPAYG|ILDPPMRC|BARPAYG' col FROM DUAL
8 UNION
9 SELECT 'BARPAYG' col FROM DUAL
10 UNION
11 SELECT 'BARPAYG|ILDPPMRC|BARPAYG|GIGMRC' col FROM DUAL),
12 data as (select '|'||col||'|' col from temp)
13 select trim('|' from col) col,
14 replace(
15 trim('|' from
16 case
17 when regexp_count(col, '|BARPAYG|') > 1
18 then regexp_replace(col, '(|BARPAYG|.*)BARPAYG|','\1')
19 else col
20 end
21 ),
22 '||', '|') res
23 from data
24 /
COL RES
----------------------------------- ------------------------------
BARPAYG BARPAYG
BARPAYG|BARPAYG BARPAYG
BARPAYG|BARPAYG|PROTECT BARPAYG|PROTECT
BARPAYG|ILDPPMRC BARPAYG|ILDPPMRC
BARPAYG|ILDPPMRC|BARPAYG BARPAYG|ILDPPMRC
BARPAYG|ILDPPMRC|BARPAYG|GIGMRC BARPAYG|ILDPPMRC|GIGMRC
|
|
|
Re: Remove all entries except last one [message #612154 is a reply to message #612153] |
Sun, 13 April 2014 14:28 |
manubatham20
Messages: 566 Registered: September 2010 Location: Seattle, WA, USA
|
Senior Member |
|
|
I did something like below
WITH temp AS (SELECT 'BARPAYG|BARPAYG|PROTECT' col FROM DUAL
UNION
SELECT 'BARPAYG|ILDPPMRC' col FROM DUAL
UNION
SELECT 'BARPAYG|BARPAYG' col FROM DUAL
UNION
SELECT 'BARPAYG|ILDPPMRC|BARPAYG' col FROM DUAL
UNION
SELECT 'BARPAYG' col FROM DUAL
UNION
SELECT 'BARPAYG|ILDPPMRC|BARPAYG|GIGMRC' col FROM DUAL)
SELECT col,
REPLACE (SUBSTR (col, 1, CASE
WHEN INSTR (col,
'BARPAYG',
-1,
1) > 1 THEN INSTR (col,
'BARPAYG',
-1,
1)
- 1
ELSE 0
END), 'BARPAYG|', '')
|| SUBSTR (col, INSTR (col,
'BARPAYG',
-1,
1)) RES
FROM temp
WHERE col LIKE '%BARPAYG%BARPAYG%';
Manu
[Updated on: Sun, 13 April 2014 14:41] Report message to a moderator
|
|
|
|
Re: Remove all entries except last one [message #612158 is a reply to message #612153] |
Sun, 13 April 2014 16:05 |
Solomon Yakobson
Messages: 3273 Registered: January 2010 Location: Connecticut, USA
|
Senior Member |
|
|
Data magic:
WITH temp AS (SELECT 'BARPAYG|SOME_JUNK_BARPAYG|PROTECT' col FROM DUAL
),
data as (select '|'||col||'|' col from temp)
select trim('|' from col) col,
replace(
trim('|' from
case
when regexp_count(col, '|BARPAYG|') > 1
then regexp_replace(col, '(|BARPAYG|.*)BARPAYG|','\1')
else col
end
),
'||', '|') res
from data
/
COL RES
--------------------------------- -----------------------------------
BARPAYG|SOME_JUNK_BARPAYG|PROTECT BARPAYG|SOME_JUNK_|PROTECT
SQL>
SY.
|
|
|
Re: Remove all entries except last one [message #612159 is a reply to message #612147] |
Sun, 13 April 2014 16:50 |
Solomon Yakobson
Messages: 3273 Registered: January 2010 Location: Connecticut, USA
|
Senior Member |
|
|
WITH temp AS (
SELECT 'BARPAYG|BARPAYG|PROTECT' col FROM DUAL UNION ALL
SELECT 'BARPAYG|ILDPPMRC' col FROM DUAL UNION ALL
SELECT 'BARPAYG|BARPAYG' col FROM DUAL UNION ALL
SELECT 'BARPAYG|ILDPPMRC|BARPAYG' col FROM DUAL UNION ALL
SELECT 'BARPAYG' col FROM DUAL UNION ALL
SELECT 'BARPAYG|ILDPPMRC|BARPAYG|GIGMRC' col FROM DUAL UNION ALL
SELECT 'XYZ|BARPAYG|ILDPPMRC|BARPAYG_SOME_JUNK|GIGMRC' col FROM DUAL UNION ALL
SELECT 'BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|GIGMRC' col FROM DUAL UNION ALL
SELECT 'XYZ|BARPAYG|abc|BARPAYG|def|BARPAYG|PROTECT' col FROM DUAL
),
t AS (
SELECT col,
INSTR(
col || '|',
'|BARPAYG|',
-1
) pos
FROM temp
)
SELECT col,
LTRIM(
REGEXP_REPLACE(
SUBSTR(
col,
1,
pos
),
'(^|\|)BARPAYG\|',
'|'
) || SUBSTR(
col,
pos + 1
),
'|'
) new_col
FROM t
/
COL NEW_COL
--------------------------------------------- ---------------------------------------------
BARPAYG|BARPAYG|PROTECT BARPAYG|PROTECT
BARPAYG|ILDPPMRC BARPAYG|ILDPPMRC
BARPAYG|BARPAYG BARPAYG
BARPAYG|ILDPPMRC|BARPAYG ILDPPMRC|BARPAYG
BARPAYG BARPAYG
BARPAYG|ILDPPMRC|BARPAYG|GIGMRC ILDPPMRC|BARPAYG|GIGMRC
XYZ|BARPAYG|ILDPPMRC|BARPAYG_SOME_JUNK|GIGMRC XYZ|BARPAYG|ILDPPMRC|BARPAYG_SOME_JUNK|GIGMRC
BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|GIGMRC BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|GIGMRC
XYZ|BARPAYG|abc|BARPAYG|def|BARPAYG|PROTECT XYZ|abc|def|BARPAYG|PROTECT
9 rows selected.
SQL>
SY.
[Updated on: Sun, 13 April 2014 17:37] Report message to a moderator
|
|
|
|
Re: Remove all entries except last one [message #612162 is a reply to message #612160] |
Sun, 13 April 2014 18:45 |
Solomon Yakobson
Messages: 3273 Registered: January 2010 Location: Connecticut, USA
|
Senior Member |
|
|
I will let Michel explain what he meant by that regexp. Anyway, can you have:
WITH temp AS (
SELECT 'XYZ|BARPAYG|abc|BARPAYG|def|BARPAYG|ghi|BARPAYG|PROTECT' col FROM DUAL
),
data as (select '|'||col||'|' col from temp)
select trim('|' from col) col,
replace(
trim('|' from
case
when regexp_count(col, '|BARPAYG|') > 1
then regexp_replace(col, '(|BARPAYG|.*)BARPAYG|','\1')
else col
end
),
'||', '|') res
from data
/
COL RES
------------------------------------------------------- --------------------------------------------------
XYZ|BARPAYG|abc|BARPAYG|def|BARPAYG|ghi|BARPAYG|PROTECT XYZ|BARPAYG|abc|BARPAYG|def|BARPAYG|ghi|PROTECT
SQL>
WITH temp AS (
SELECT 'XYZ|BARPAYG|abc|BARPAYG|def|BARPAYG|ghi|BARPAYG|PROTECT' col FROM DUAL
),
t AS (
SELECT col,
INSTR(
col || '|',
'|BARPAYG|',
-1
) pos
FROM temp
)
SELECT col,
LTRIM(
REGEXP_REPLACE(
SUBSTR(
col,
1,
pos
),
'(^|\|)BARPAYG\|',
'|'
) || SUBSTR(
col,
pos + 1
),
'|'
) new_col
FROM t
/
COL NEW_COL
------------------------------------------------------- -------------------------------
XYZ|BARPAYG|abc|BARPAYG|def|BARPAYG|ghi|BARPAYG|PROTECT XYZ|abc|def|ghi|BARPAYG|PROTECT
SQL>
SY.
SY.
|
|
|
|
Re: Remove all entries except last one [message #612169 is a reply to message #612158] |
Mon, 14 April 2014 00:12 |
|
Michel Cadot
Messages: 68645 Registered: March 2007 Location: Nanterre, France, http://...
|
Senior Member Account Moderator |
|
|
Solomon Yakobson wrote on Sun, 13 April 2014 23:05Data magic:
WITH temp AS (SELECT 'BARPAYG|SOME_JUNK_BARPAYG|PROTECT' col FROM DUAL
),
data as (select '|'||col||'|' col from temp)
select trim('|' from col) col,
replace(
trim('|' from
case
when regexp_count(col, '|BARPAYG|') > 1
then regexp_replace(col, '(|BARPAYG|.*)BARPAYG|','\1')
else col
end
),
'||', '|') res
from data
/
COL RES
--------------------------------- -----------------------------------
BARPAYG|SOME_JUNK_BARPAYG|PROTECT BARPAYG|SOME_JUNK_|PROTECT
SQL>
SY.
Yes I know and I was sure you'll come with an example like that. I even wrote a sentence telling so but I removed it to just let OP find the weakness of the expression.
|
|
|
|
Re: Remove all entries except last one [message #612181 is a reply to message #612171] |
Mon, 14 April 2014 03:15 |
|
Michel Cadot
Messages: 68645 Registered: March 2007 Location: Nanterre, France, http://...
|
Senior Member Account Moderator |
|
|
Here's a "solution":
SQL> WITH temp AS (
2 SELECT 'BARPAYG|BARPAYG|PROTECT' col FROM DUAL UNION ALL
3 SELECT 'BARPAYG|ILDPPMRC' col FROM DUAL UNION ALL
4 SELECT 'BARPAYG|BARPAYG' col FROM DUAL UNION ALL
5 SELECT 'BARPAYG|ILDPPMRC|BARPAYG' col FROM DUAL UNION ALL
6 SELECT 'BARPAYG' col FROM DUAL UNION ALL
7 SELECT 'BARPAYG|ILDPPMRC|BARPAYG|GIGMRC' col FROM DUAL UNION ALL
8 SELECT 'XYZ|BARPAYG|ILDPPMRC|BARPAYG_SOME_JUNK|GIGMRC' col FROM DUAL UNION ALL
9 SELECT 'BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|GIGMRC' col FROM DUAL UNION ALL
10 SELECT 'XYZ|BARPAYG|ILDPPMRC|BARPAYG_SOME_JUNK|GIGMRC|BARPAYG' col FROM DUAL UNION ALL
11 SELECT 'BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|BARPAYG|GIGMRC' col FROM DUAL UNION ALL
12 SELECT 'XYZ|BARPAYG|ILDPPMRC|BARPAYG|BARPAYG_SOME_JUNK|GIGMRC' col FROM DUAL UNION ALL
13 SELECT 'BARPAYG|ILDPPMRC|BARPAYG|SOME_JUNK_BARPAYG|GIGMRC' col FROM DUAL UNION ALL
14 SELECT 'XYZ|BARPAYG|abc|BARPAYG|def|BARPAYG|PROTECT' col FROM DUAL
15 ),
16 data as (select '#' || replace(col, '|', '|#') || '|' col from temp)
17 select rtrim (substr (replace (col, '|#', '|'), 2), '|') col,
18 rtrim (
19 substr (
20 replace (
21 replace (
22 case
23 when regexp_count (col, '#BARPAYG\|') > 1
24 then regexp_replace (col, '(#BARPAYG\|.*)#BARPAYG|', '\1')
25 else col
26 end,
27 '||', '|'),
28 '|#', '|') ,
29 2),
30 '|')
31 res
32 from data
33 /
COL RES
----------------------------------------------------- ----------------------------------------------
BARPAYG|BARPAYG|PROTECT BARPAYG|PROTECT
BARPAYG|ILDPPMRC BARPAYG|ILDPPMRC
BARPAYG|BARPAYG BARPAYG
BARPAYG|ILDPPMRC|BARPAYG BARPAYG|ILDPPMRC
BARPAYG BARPAYG
BARPAYG|ILDPPMRC|BARPAYG|GIGMRC BARPAYG|ILDPPMRC|GIGMRC
XYZ|BARPAYG|ILDPPMRC|BARPAYG_SOME_JUNK|GIGMRC XYZ|BARPAYG|ILDPPMRC|BARPAYG_SOME_JUNK|GIGMRC
BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|GIGMRC BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|GIGMRC
XYZ|BARPAYG|ILDPPMRC|BARPAYG_SOME_JUNK|GIGMRC|BARPAYG XYZ|BARPAYG|ILDPPMRC|BARPAYG_SOME_JUNK|GIGMRC
BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|BARPAYG|GIGMRC BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|GIGMRC
XYZ|BARPAYG|ILDPPMRC|BARPAYG|BARPAYG_SOME_JUNK|GIGMRC XYZ|BARPAYG|ILDPPMRC|BARPAYG|_SOME_JUNK|GIGMRC
BARPAYG|ILDPPMRC|BARPAYG|SOME_JUNK_BARPAYG|GIGMRC BARPAYG|ILDPPMRC|SOME_JUNK_BARPAYG|GIGMRC
XYZ|BARPAYG|abc|BARPAYG|def|BARPAYG|PROTECT XYZ|BARPAYG|abc|BARPAYG|def|PROTECT
[Edit: add more data]
[Updated on: Mon, 14 April 2014 03:22] Report message to a moderator
|
|
|
|
|
Goto Forum:
Current Time: Thu Apr 25 00:25:20 CDT 2024
|