Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据前缀列表有效地检查记录_Sql_Sql Server - Fatal编程技术网

Sql 如何根据前缀列表有效地检查记录

Sql 如何根据前缀列表有效地检查记录,sql,sql-server,Sql,Sql Server,我正试图找出一个查询,它可以有效地让我对照前缀列表检查特定的数字 我的桌子结构是这样的 表1 MobileNumber 408726172 307612535 408642517 111824374 表2 Prefix 408 3076 现在您可以看到一些MobileNumber以408和307开头,前缀表包含408和3076。有没有一种方法可以在不使用循环的情况下检查SELECT语句中的有效前缀 我的想法是一个SQL查询 SELECT MobileNumber FROM Table1 WH

我正试图找出一个查询,它可以有效地让我对照前缀列表检查特定的数字

我的桌子结构是这样的

表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
我就是不明白我是怎么做到的

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

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

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

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 + '%') 

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

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 + '%') 

可能另一种方法是:

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

可能另一种方法是:

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


什么数据类型是
MobileNumber
?@dotnetom MobileNumber是一个varchar,前缀相同。你真的应该将这两个值分开,而不是像这样对抗你的模式。由于区号(或前缀)和站号在同一列中,因此在一个交叉口中存在多个数据段,违反了1NF。将其拆分会变得更简单。
MobileNumber
的数据类型是什么?@dotnetom MobileNumber是一个varchar,与prefixy相同。你真的应该将这两个值分开,而不是像这样与模式对抗。由于区号(或前缀)和站号在同一列中,因此在一个交叉口中存在多个数据段,违反了1NF。把这个分开,它就变得容易多了。它并不总是3个数字,它可能是4,甚至5,这在我上面的模式中得到了证明。我根据你上面的回答更新了答案。请让我知道这是否适合你!谢谢如果MobileNumber被编入索引,那么这样的话,它将退出游戏。我认为这是可行的,但速度还是很慢。它并不总是3个数字,可能是4个,甚至是5个,这在我上面的模式中得到了证明。我根据你上面的回答更新了答案。请让我知道这是否适合你!谢谢如果MobileNumber被编入索引,那么这样的话,它将退出游戏。我认为这是可行的,但速度仍然很慢。谢谢,我会在我的系统上试一试,如果它有效,我会重新接受答案。谢谢,我会在我的系统上试一试,如果它有效,我会重新接受答案。谢谢,我会在我的系统上试一试,如果它有效,我会重新接受答案。@Sandepbansal,还要注意,带有join的解决方案可以为1个MobileNumber返回多行:例如,MobileNumber=123456,Prefix1=12,Prefix2=123;如果join MobileNumber=123456 twiceThanks输出,我会在我的系统上试一试,如果它有效,我会重新接受答案。@Sandepbansal,还要注意,join的解决方案可以为1个MobileNumber返回多行:例如,MobileNumber=123456,Prefix1=12,Prefix2=123;使用join MobileNumber=123456输出两次