Il doit y avoir une colonne correspondante entre votre table client
et l'autre table. Il ne ressort pas clairement de votre description quelle est cette colonne. D'après ce que vous avez dit, je crois que votre schéma ressemble à:
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
)
En supposant que Client.Mobile correspond MobileNumbers.Name, nous avons:
Select ...
From Client
Join MobileNumbers
On MobileNumbers.MobileNo = Client.Mobile
Where Client.Mobile In('9887456321','6985326598','88523695874')
Dans cette structure, je suppose que chaque La valeur mobile contient un nombre unique et non une liste de nombres délimitée par des virgules. Si c'est effectivement le cas, une seule cellule peut contenir plusieurs valeurs (veuillez modifier votre message original, c'est le cas), alors comme Martin Smith l'a mentionné, vous devez normaliser les données.
EDIT
Compte tenu de votre révision de l'OP, la racine du problème est que vous avez plusieurs valeurs dans une seule colonne. La bonne solution serait de normaliser les numéros mobiles dans une seconde table:
Create Table UserMobileNumber
(
UserId ... not null References User (Id)
, Carrier varchar(??) not null
, Mobile varchar(??) not null
, Constraint UC_UserMobileNumber Unique (Mobile)
)
Ensuite, la solution devient trivial:
Select ...
From User
Join UserMobileNumber
On UserMobileNumber.UserId = User.Id
Where UserMobileNumber.Mobile In('9887456321','6985326598','88523695874')
Toutefois, dans l'intervalle, ce que vous avez besoin est une fonction split:
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
)
maintenant, vous pouvez faire quelque chose comme:
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')
Une seule valeur mobile peut-elle contenir trois virgules séparées par des nombres différents ou est-ce qu'il y a trois lignes avec les trois nombres mentionnés? – Thomas
Merci George. Les choses semblent beaucoup plus claires après la modification. @Neo Certaines restructurations semblent définitivement en ordre. Quelle est la relation entre les utilisateurs, les clients et les mobiles? Est-ce qu'un client n'a qu'un seul mobile? Si oui, cela signifie-t-il toujours avoir un et un seul enregistrement correspondant dans la table des utilisateurs? –