【问题标题】:How to efficiently check records based off a list of prefixes如何根据前缀列表有效地检查记录
【发布时间】:2015-07-14 06:02:05
【问题描述】:

我正在尝试找出一个查询,该查询将有效地允许我根据前缀列表检查特定数字。

我的表结构是这样的

表 1

MobileNumber
408726172
307612535
408642517
111824374

表 2

Prefix
408
3076

现在您可以看到一些 MobileNumber 以 408 和 307 开头,前缀表包含 408 和 3076。有没有一种方法可以在不使用循环的情况下检查 SELECT 语句中的有效前缀?

我的想法是一个看起来像这样的 SQL 查询

SELECT MobileNumber FROM Table1 WHERE THE FIRST PART OF THE NUMBER MATCHES ANY OF THE Prefixes in Table2

我只是不明白我该怎么做

【问题讨论】:

  • MobileNumber是什么数据类型?
  • @dotnetom MobileNumber 是一个与 Prefix 相同的 varchar
  • 您确实应该将这两个值分开,而不是像这样与您的架构发生冲突。由于您在同一列中具有区号(或前缀)和站号,因此您在一个交叉路口拥有多条数据,从而违反了 1NF。把它分开,它会变得容易得多。

标签: sql sql-server


【解决方案1】:

有点像

SELECT Table1.MobileNumber 
  FROM Table1 
         INNER JOIN Table2 ON Table1.MobileNumber LIKE Table2.Prefix +'%'

【讨论】:

  • 谢谢,我会在我的系统上试一试,如果它有效,我会重新接受答案。
【解决方案2】:

选择所有数字将有效/无效属性:

select 
  MobileNumber,
  case when exists (select 1 from Table_2 where MobileNumber like Prefix + '%') 
  then 1 else 0 end as IsValid
from Table_1

只选择有效数字:

select 
MobileNumber
from Table_1
where exists (select 1 from Table_2 where MobileNumber like Prefix + '%') 

【讨论】:

  • 谢谢,我会在我的系统上试一试,如果可行,我会重新接受答案。
  • @SandeepBansal,另请注意,加入的解决方案可以为 1 个 MobileNumber 返回多行:例如。手机号码 = 123456,前缀 1 = 12,前缀 2 = 123;输出加入 MobileNumber = 123456 两次
【解决方案3】:

这样做的另一种方法可能是这样的:

SELECT Table1.MobileNumber
FROM Table1
INNER JOIN Table2 ON LEFT(Table1.MobileNumber, LEN(Table2.Prefix)) = Table2.Prefix

【讨论】:

  • 它并不总是 3 个数字,它可能是 4 甚至 5,这在我上面的架构中展示了
  • 我根据您上面的回复更新了答案。请让我知道这是否适合您!谢谢!
  • 如果 MobileNumber 被编入索引,那么这个人就会被淘汰出局。我认为这可行,但往往很慢。
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2021-12-20
  • 2021-04-04
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多