Соедините две таблицы телефонных номеров, где номера имеют разные форматы - PullRequest
1 голос
/ 09 мая 2019

У меня есть интересная / разочаровывающая проблема, решение которой у меня уже есть - однако она медленная, и я не уверен, что это лучший способ ее решения.

У меня есть две таблицы, к которым я хочу присоединиться.Первое я буду называть [MobileNumber], а второе [MobileInventory].Таблица [MobileNumber] содержит числа в формате 7123456789. Таблица [MobileInventory] содержит числа, которые могут иметь любой из следующих трех форматов - 7123456789, 07123456789, +447123456789.Мне нужно объединить два, и единственное общее поле - это номер мобильного телефона.

Эти две проблемы заключаются в том, что в [MobileInventory] я не могу гарантировать формат (экспорт из внешней системы) и числа в обеих таблицахони из разных стран с разными кодами длины (+1, +44, +852) и в пределах [MobileNumber] я не могу сказать, из какой страны номер.Это делает очень трудным просто удалить первые x символов из [MobileInventory] или выполнить замену в любом известном коде страны (рискованно!) И выполнить.

Мое решение ( работает )):

SELECT *
FROM [MobileNumber]
LEFT OUTER JOIN [MobileInventory]
ON CHARINDEX(REVERSE([MobileNumber].[Number]), REVERSE([MobileInventory]),1) = 1

Если оба числа поменялись местами, легко увидеть, если вы получаете позицию [MobileNumber]. [Number] в [MobileInventory]. [Mobile] и если результат равен 1 - это совпадение.

9876543217

98765432170

987654321744 +

98765432174400

Это работает, и я получаю очень хороший результат совпадения - однако,это так медленно!У меня есть номера c.50k в [MobileNumber] и c.20k в [MobileInventory].

Следующее, что нужно попробовать, - это (как я использую результат выше в MERGE в хранимой процедуре), чтобывозьмите GUID из [MobileInvetory] и сохраните в [MobileNumber] для последующих объединений просмотра, так что я мог бы добиться этого, используя курсор в курсоре для сравнения, но я не уверен, что это будет быстрее.

Я проверил похожие вопросы, и, похоже, что решенные проблемы связаны с разделителями или последовательными кодами стран, которые не относятся к моей проблеме.

Вышеуказанное автоматизировано с помощью запланированной задачи,так что я мог бы просто начать его раньше, но это как-то не так!

1 Ответ

1 голос
/ 09 мая 2019

Есть несколько способов сделать это. Используя только код, здесь есть 2 варианта.

SELECT *
FROM [MobileNumber]
LEFT OUTER JOIN [MobileInventory]
ON [MobileNumber].[Number] = RIGHT([MobileInventory], LEN([MobileNumber].[Number]));

SELECT *
FROM [MobileNumber]
LEFT OUTER JOIN [MobileInventory]
ON [MobileInventory] LIKE '%' + [MobileNumber].[Number];

В первом ожидается, что все номера будут иметь длину 10 цифр, но я не уверен, что в некоторых странах могут быть более короткие номера. принимает длину номера мобильного телефона.

Вы также можете создать постоянный вычисляемый столбец в MobileInventory, чтобы проиндексировать его и создать более эффективное объединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...