/ / la cláusula IN no funciona en mi declaración de SQL incorporado - servidor sql

la cláusula IN no funciona en mi declaración de SQL incorporado - servidor sql

Tengo la siguiente tabla

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

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

Escribí consulta:

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

Result:
~~~~~~~
0 Rows

La consulta anterior no me devuelve ningún resultado mientras funciona bien cuando especifico directamente los valores para la cláusula In en la declaración.

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

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

Sin embargo, cuando cambio la condición en muy primera consulta con el fútbol:

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

Esto me devuelve el siguiente resultado:

UserID         Name
4              Lisa
1 row

¿Cómo puedo evitar que mi primera consulta me devuelva el resultado correcto?

Creo que estoy en la dirección equivocada. ¡Ayúdame!

Respuestas

5 para la respuesta № 1

Esto es lo que obtiene para almacenar valores separados por comas en un campo. Ahora tienes que dividirlo, usando, digamos esta función y hacer algo como

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

Pero considere cambiar el diseño de su "Juego" de mesa a

Games          Players
Golf           1
Golf           3
Golf           5
Football       4

Entonces puedes hacer simple

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

Sin funciones adicionales.


2 para la respuesta № 2

Su primera consulta se traduce a esto:

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

Observe que es una representación de cadena de los ID, no una lista separada por comas como en su segunda consulta.

Hay muchos Split funciones por ahí escritas para este mismo escenario.

Puede utilizar uno de ellos como tal:

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 para la respuesta № 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))

Resultados SQL Fiddle:

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