/ / klauzula IN nie działa w mojej wbudowanej instrukcji SQL - sql-server

klauzula IN nie działa w mojej osadzonej instrukcji SQL - sql-server

Mam następującą tabelę

Table User
UserID         Name
1              Om
2              John
3              Kisan
4              Lisa
5              Karel

Table Game
Games          Players
Golf           1,3,5
Football       4

Napisałem zapytanie:

Select UserId,
Name from User
Where UserID IN
(Select Players from Game where Games="Golf")

Result:
~~~~~~~
0 Rows

Powyższe zapytanie nie zwraca mi żadnego wyniku, gdy działa poprawnie, gdy bezpośrednio określam wartości dla wyrażenia In w instrukcji.

Select UserId, Name
from User
Where UserID IN (1,3,5)

Result:
~~~~~~~
UserID         Name
1              Om
3              Kisan
5              Karel
3 rows

Jednak gdy zmienię warunek w pierwszym zapytaniu z piłką nożną:

Select UserId, Name
from User
Where UserID IN
(Select Players
from Game
where Games="Football").

Zwraca mi następujący wynik:

UserID         Name
4              Lisa
1 row

Jak mogę obejść się, aby moje pierwsze zapytanie zwróciło mi prawidłowy wynik?

Myślę, że jestem w złym kierunku. Pomóż mi!

Odpowiedzi:

5 dla odpowiedzi № 1

To właśnie dostajesz do przechowywania wartości rozdzielonych przecinkami w polu. Teraz musisz go podzielić, używając, powiedz ta funkcja i zrób coś takiego

Select User.UserId, User.Name from User
inner join splitstring((Select Players from Game where Games="Golf")) a
on User.UserID = a.Name

Ale zastanów się nad zmianą projektu "Game" w tabeli

Games          Players
Golf           1
Golf           3
Golf           5
Football       4

Wtedy możesz zrobić proste

Select User.UserId, User.Name
from User inner join Game
on User.UserID = Game.Players
Where Game.Games = "Golf"

bez żadnych dodatkowych funkcji.


2 dla odpowiedzi nr 2

Twoje pierwsze zapytanie tłumaczy się na to:

Select UserId, Name
from User
Where UserID IN (`1,3,5`)

Zauważ, że jest to ciąg znaków reprezentujący identyfikatory, a nie listę rozdzielaną przecinkami, tak jak w drugim zapytaniu.

Jest wiele Split funkcje tam napisane dla tego właśnie scenariusza.

Możesz wykorzystać jeden z nich jako taki:

DECLARE @PlayersCsv NVARCHAR(MAX)
Select @PlayersCsv = Players from Game where Games="Golf"

Select UserId,
Name from User
Where UserID IN
(Select Value FROM dbo.Split(@PlayersCsv, ","))

0 dla odpowiedzi № 3
DECLARE @xml AS xml
SET @xml = (SELECT cast("<X>"+(""+replace(players,"," ,"</X><X>")+"</X>") AS xml)
FROM Game WHERE Games="Golf")
SELECT UserId, Name
FROM User
WHERE UserID IN
(SELECT N.value(".", "varchar(10)") as value FROM @xml.nodes("X") as T(N))

Wyniki Fiddle SQL:

| USERID |  NAME |
|--------|-------|
|      1 |    Om |
|      3 | Kisan |
|      5 | Karel |