Между вашей таблицей client
и другой таблицей должен быть соответствующий столбец. Из вашего описания не ясно, что это за столбец. Из того, что вы сказали, я считаю, что ваша схема выглядит так:
Create Table MobileNumbers
(
Id ... not null Primary Key
, Name varchar(??) not null
, Mobile varchar(??) not null
)
Create Table Client
(
Id ... not null Primary Key
, ClientName varchar(??) not null
, MobileNo varchar(??) not null
)
Предполагая, что Client.Mobile соответствует MobileNumbers.Name, у нас есть:
Select ...
From Client
Join MobileNumbers
On MobileNumbers.MobileNo = Client.Mobile
Where Client.Mobile In('9887456321','6985326598','88523695874')
В этой структуре я предполагаю, что каждое значение Mobile содержит одно число, а не список чисел, разделенных запятыми. Если это действительно так, что одна ячейка может содержать несколько значений (пожалуйста, отредактируйте исходное сообщение в этом случае), то, как отметил Мартин Смит, вам нужно нормализовать данные.
EDIT
Учитывая вашу ревизию OP, основная проблема заключается в том, что у вас есть несколько значений в одном столбце. Правильным решением было бы нормализовать номера мобильных телефонов во второй таблице:
Create Table UserMobileNumber
(
UserId ... not null References User ( Id )
, Carrier varchar(??) not null
, Mobile varchar(??) not null
, Constraint UC_UserMobileNumber Unique ( Mobile )
)
Тогда решение становится тривиальным:
Select ...
From User
Join UserMobileNumber
On UserMobileNumber.UserId = User.Id
Where UserMobileNumber.Mobile In('9887456321','6985326598','88523695874')
Однако, тем временем, вам нужна функция разделения:
Create Function dbo.udf_Split
(
@DelimitedList nvarchar(max)
, @Delimiter nvarchar(2) = ','
)
Returns Table
As
Return
(
With CorrectedList As
(
Select Case When Left(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End
+ @DelimitedList
+ Case When Right(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End
As List
, Len(@Delimiter) As DelimiterLen
)
, Numbers As
(
Select TOP (Len(@DelimitedList) + 2) Row_Number() Over ( Order By c1.object_id ) As Value
From sys.columns As c1
Cross Join sys.columns As c2
)
Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position
, Substring (
CL.List
, CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen
, CharIndex(@Delimiter, CL.list, N.Value + 1)
- ( CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen )
) As Value
From CorrectedList As CL
Cross Join Numbers As N
Where N.Value < Len(CL.List)
And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter
)
Теперь вы можете сделать что-то вроде:
Select ...
From User
Outer Apply dbo.Split( User.Mobile ) As M
Join Client
On Client.MobileNo = M.Value
Where M.Value In('9887456321','6985326598','88523695874')