I have a table containing contact numbers and another reference table containing a “length” variable and a number column. What I need is to find the prefix name where the prefix of the number matches the one in the reference table, but it should be the one that goes with the longest prefix matching. (omg I hope that make sense)
What I’ve tried so far:
x
select a.record_type,a.number,b.prefix,b.prefix_name
from first_table a , second_table b
where a.transaction_date=20180924 and case
when b.length=1 then substr(a.number,1,1)=b.prefix
when b.length=2 then substr(a.number,1,2)=b.prefix
when b.length=3 then substr(a.number,1,3)=b.prefix
when b.length=4 then substr(a.number,1,4)=b.prefix
when b.length=5 then substr(a.number,1,5)=b.prefix
when b.length=6 then substr(a.number,1,6)=b.prefix
when b.length=7 then substr(a.number,1,7)=b.prefix
when b.length=8 then substr(a.number,1,8)=b.prefix
when b.length=9 then substr(a.number,1,9)=b.prefix
when b.length=10 then substr(a.number,1,10)=b.prefix
when b.length=11 then substr(a.number,1,11)=b.prefix
when b.length=12 then substr(a.number,1,12)=b.prefix
when b.length=13 then substr(a.number,1,13)=b.prefix
when b.length=14 then substr(a.number,1,14)=b.prefix
end
However it still returns duplicate result, i.e: if the number is 12345, it matches the reference with prefix 1234 and 123, while I actually just want the 1234 one.
Is there any way to like prioritize the case? Thanks
An example of the data in the two tables: example
My current result and the desired result: results
Advertisement
Answer
Ok I reworked it, try this:
WITH FIRST_TABLE (RECORD_TYPE,NUM,TRANSACTION_DATE)AS (
SELECT 'a',12345, DATE '2018-09-24' FROM DUAL
),
SECOND_TABLE (PREFIX,PREFIX_NAME,LENGTH) AS(
SELECT 12,'Type A', 2 FROM DUAL union all
SELECT 1234,'Type B', 4 FROM DUAL
)
select * from (
SELECT A.RECORD_TYPE,A.NUM,B.PREFIX,B.PREFIX_NAME, MAX(B.PREFIX) OVER (PARTITION BY A.RECORD_TYPE,A.NUM) maxPrefix
FROM FIRST_TABLE A ,SECOND_TABLE B
WHERE A.TRANSACTION_DATE=DATE '2018-09-24'
AND A.NUM LIKE (B.PREFIX||'%')
)
where PREFIX=maxPrefix;