加入电话号码的两个表格,其中电话号码的格式不同

时间:2019-05-09 20:37:51

标签: sql-server

我有一个有趣的/令人沮丧的问题,已经有了解决方案-但是它很慢,而且我不认为这是解决问题的最佳方法。

我想加入两个表。我将第一个称为[MobileNumber],第二个称为[MobileInventory]。表[MobileNumber]包含格式为7123456789的数字。表[MobileInventory]包含可能为以下三种格式之一的数字-7123456789、07123456789,+ 44712​​3456789。我需要将两者结合起来,唯一的共同领域是手机号码。

这两个问题是,[MobileInventory]中无法保证格式(外部系统的导出),并且两个表中的数字均来自多个国家/地区,且国家/地区代码的长度不同(+ 1,+ 44,+ 852)在[MobileNumber]中,我无法告诉您数字是来自哪个国家。这使得很难从[MobileInventory]中删除前x个字符或对任何已知的国家(地区)代码(危险!)进行替换。

我的解决方案(有效):

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

两个数字都颠倒了,很容易看出您是否在[MobileInventory]。[Mobile]中获得了[MobileNumber]。[Number]的位置,如果结果为1,则表示匹配。

9876543217

98765432170

987654321744 +

98765432174400

这有效,我得到了很好的比赛结果-但是,速度太慢了!我在[MobileNumber]中有c.50k的数字,在[MobileInventory]中有c.20k的数字。

接下来要尝试的是(因为我在存储过程中的MERGE中使用上述结果)从[MobileInvetory]中获取GUID并存储在[MobileNumber]中,以便以后进行视图联接,所以我可以使用游标中的游标进行比较,但是我不相信这样做会更快。

我检查了类似的问题,解决的问题似乎是分隔符或不适用于我的问题的一致的国家/地区代码。

以上内容是通过计划任务自动执行的,因此我可以在当天早些时候开始,但这似乎不对劲!

1 个答案:

答案 0 :(得分:1)

有几种方法可以执行此操作。仅使用代码,这里有两种选择。

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if scrollView.contentOffset.y <= -50 {
        refreshControl.beginRefreshing()
        print("Start Refresh Service")
    }
}

第一个预计所有数字的长度都为10位数字,但是我不确定某些国家/地区的号码可能较短。使用移动电话的长度。

您还可以在MobileInventory上创建一个持久化的计算列,以对该列建立索引并创建更有效的联接。