2 votes

SQL Server + Select WHERE IN chaîne délimitée par des virgules

J'essaie de sélectionner les enregistrements où l'Id existe dans une chaîne délimitée par des virgules, mais la requête ci-dessous ne renvoie aucun résultat :

  SELECT * FROM [SellPost] WHERE CAST([AutoId] AS nchar(100)) 
   IN (SELECT [SellPostId] FROM [SellPostViewHistory]) -- SellPostId contains the delimited string 

L'instruction 'SELECT [SellPostId] FROM [SellPostViewHistory]' renvoie 19,20,21 et si je remplace cette requête par

   SELECT * FROM [SellPost] WHERE CAST([AutoId] AS nchar(100)) 
   IN (19,20,21) 

ça marche. Quelqu'un peut-il me conseiller ? Merci.

4voto

Yuriy Galanter Points 21066

Si votre sélection interne renvoie une valeur de chaîne unique, comme '19, 20, 21', l'utilisation de IN ne fonctionnera pas. Vous devez la diviser en variable de table ( recherche SO il y a beaucoup d'options sur la façon de le faire ).

Ensuite, vous pouvez soit joindre votre requête originale avec cette variable temporaire, soit exécuter votre instruction IN avec un SELECT de cette table.

2voto

k80sg Points 1

La plupart des gens le savent probablement déjà, mais c'est pourtant l'une des solutions :

Créez une fonction de fractionnement :

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Split](
  @delimited NVARCHAR(MAX),
  @delimiter NVARCHAR(100)
) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
  DECLARE @xml XML
  SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'

  INSERT INTO @t(val)
  SELECT  r.value('.','varchar(MAX)') as item
  FROM  @xml.nodes('/t') as records(r)
  RETURN
END

Utilisation :

 DECLARE @SellPostIds nvarchar(MAX)
   SET @SellPostIds = (SELECT [SellPostId] FROM [SellPostViewHistory])

   SELECT * FROM [SellPost] WHERE CAST([AutoId] AS nchar(100)) 
   IN (SELECT val FROM dbo.Split(@SellPostIds, ','))

0voto

user2647012 Points 34

Vous avez besoin d'une séparation CSV-table, vous pouvez avoir un UDF qui prend l'entrée comme une chaîne et retourne une table, faire une jointure à ces tables et travailler avec votre clause IN.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X