Delete a character from one string at a time from the right until a match is found

advertisements

I have two temp tables populated with Id's.

The #Master table is from one system while the #Extended table is from another system where people have added characters to the Id.

The issue I'm now having is to write a SELECT query to check to see if there is a match or if not to remove one character at a time until there is a match. As you can see below there will be instances where there won't be an exact match in that case I would just like to return one of the possible values (1-12L7QABC could return 1-12L7QO or 1-12L7QM).

CREATE TABLE #Master(Id nvarchar(15), ClientName nvarchar(35));
INSERT INTO #Master
VALUES('1-12L7QO', 'John Citizen'),
      ('1-12L7QM', 'Steve Smith'),
      ('1-10YL',   'Sarah Connor'),
      ('1-2CN9WN', 'Cathy Rodgers');

CREATE TABLE #Extended(ExtId varchar(15));
INSERT INTO #Extended
VALUES('1-12L7QO`'),
      ('1-12L7QABC'),
      ('1-10YL'),
      ('1-12L7QMTest');

The expected output is:

+---------------+---------------+-----------------------------------+
| Id            | BaseId        | Name                              |
+---------------+---------------+-----------------------------------+
| 1-12L7QO`     | 1-12L7QO      | John Citizen                      |
| 1-12L7QABC    | 1-12L7QO      | John Citizen                      |
| 1-10YL        | 1-10YL        | Sarah Connor                      |
| 1-12L7QMTest  | 1-12L7QM      | Steve Smith                       |
+---------------+---------------+-----------------------------------+


One method is to create all possible substrings and then do the match:

with m as (
      select m.id, m.ClientName
      from #Master m
      union all
      select left(m.id, len(m.Id) - 1), m.ClientName
      from m
      where m.Id <> ''
     )
select e.ExtId, m.Id, m.ClientName
from #Extended e outer apply
     (select top 1 m.*
      from m
      where e.ExtId like m.id + '%'
      order by len(m.id) desc
     ) m;

I don't want to argue that this is efficient, but it should do what you want. And, it's fine on a small data set.