Necesito usar una cadena delimitada por comas para SQL AND condición en cada palabra

Entonces tengo un parámetro. Digamos:

@Tags = 'Red,Large,New' 

Tengo un campo en mi table llamado [Etiquetas]

Digamos que una fila en particular ese campo contiene "Rojo, Grande, Nuevo, Algo más, YAlgo más"

¿Cómo puedo romper eso para básicamente lograr la siguiente lógica, que escribiré para entender pero sé que está mal:

 SELECT * FROM MyTable WHERE Tags LIKE 'FirstWordInString' AND Tags Like 'SecondWordInString' AND Tags Like 'ThirdWordInString' 

¿Pero sabe dónde parar? ¿Sabe si hay una sola palabra? ¿O dos? O tres?

Flujo de trabajo:

Alguien hace clic en una label y esa label filtra el set de datos. Hacen clic en otro y la label se agrega al cuadro de búsqueda y el set de datos se filtra por ambas tags, etc.

¡Gracias!

Actualizar:

Esta es una situación basada en el producto.

  1. Cuando se crea un producto, el creador puede ingresar tags de búsqueda separadas por comas.
  2. Cuando se inserta el producto, las tags de búsqueda se insertan en una tabla separada llamada ProductTags (ProductID, TagID)

Por lo tanto, en la tabla Producto, tengo un campo que los tiene separados por una cadena para mostrarlos en el lado de la aplicación, y estas mismas tags también se encuentran en la tabla ProductTag, separadas por fila en function de ProductID.

Lo que no entiendo es cómo colocar la condición en la selección que ofrece resultados si todas las tags en la búsqueda existen para ese producto.

Pensé que sería más fácil usar el campo separado por comas, pero tal vez debería usar la tabla correspondiente (ProductTags)

Un enfoque de split relacional que utiliza la tabla ProductTags es

 DECLARE @TagsToSearch TABLE ( TagId VARCHAR(50) PRIMARY KEY ) INSERT INTO @TagsToSearch VALUES ('Red'), ('Large'), ('New') SELECT PT.ProductID FROM ProductTags PT JOIN @TagsToSearch TS ON TS.TagId = PT.TagId GROUP BY PT.ProductID HAVING COUNT(*) = (SELECT COUNT(*) FROM @TagsToSearch) 

La tabla @TagsToSearch idealmente sería un parámetro con valores de tabla pasados ​​directamente desde su aplicación, pero también podría completarse utilizando una function dividida contra su parámetro delimitado por comas.

Solo necesitas agregar comodines:

 SELECT * FROM MyTable WHERE ','+Tags+',' LIKE '%,FirstWordInString,%' AND ','+Tags+','Like '%,SecondWordInString,%' AND ','+Tags+','Like '%,ThirdWordInString,%' 

ACTUALIZACIÓN: entiendo ahora que el problema es que tiene una variable con la que intenta hacer coincidir las tags. La variable tiene la list de cadenas de tags. Si divide la list de tags seleccionadas por el usuario utilizando una function de cadena dividida, o puede get las tags seleccionadas por el usuario desde el formulario de input por separado, entonces puede simplemente usar:

 SELECT * FROM MyTable WHERE ',,'+Tags+',' LIKE '%,'+@tag1+',%' AND ',,'+Tags+',' LIKE '%,'+@tag2+',%' AND ',,'+Tags+',' LIKE '%,'+@tag3+',%' AND ',,'+Tags+',' LIKE '%,'+@tag4+',%' 

etc.

Esto funcionará para cualquier cantidad de tags ingresadas, ya que una label @tag vacía daría como resultado la doble coma adjunta al campo de tags que coincida con '%,,%' .

Desde el proyecto de código:

 -- ============================================= -- Author: Md. Marufuzzaman -- Create date: -- Description: Split an expression. -- Note: If you are using SQL Server 2000, You need to change the -- length (MAX) to your maximum expression length of each datatype. -- ============================================= /* SELECT * FROM [dbo].[SPLIT] (';','I love codeProject;!!!;Your development resources') */ CREATE FUNCTION [dbo].[SPLIT] ( @DELIMITER VARCHAR(5), @LIST VARCHAR(MAX) ) RETURNS @TABLEOFVALUES TABLE ( ROWID SMALLINT IDENTITY(1,1), [VALUE] VARCHAR(MAX) ) AS BEGIN DECLARE @LENSTRING INT WHILE LEN( @LIST ) > 0 BEGIN SELECT @LENSTRING = (CASE CHARINDEX( @DELIMITER, @LIST ) WHEN 0 THEN LEN( @LIST ) ELSE ( CHARINDEX( @DELIMITER, @LIST ) -1 ) END ) INSERT INTO @TABLEOFVALUES SELECT SUBSTRING( @LIST, 1, @LENSTRING ) SELECT @LIST = (CASE ( LEN( @LIST ) - @LENSTRING ) WHEN 0 THEN '' ELSE RIGHT( @LIST, LEN( @LIST ) - @LENSTRING - 1 ) END ) END RETURN END 

http://www.codeproject.com/Articles/38843/An-Easy- But-Effective-Way-to-Split-a-String-using