2009-04-10 11 views
6

Tengo una tabla de productos. Cada fila en esa tabla corresponde a un solo producto y se identifica con un Id único. Ahora cada producto puede tener múltiples "códigos" asociados con ese producto. Por ejemplo:Valores separados por comas en un campo de base de datos

 
Id  | Code 
---------------------- 
0001 | IN,ON,ME,OH 
0002 | ON,VI,AC,ZO 
0003 | QA,PS,OO,ME 

Lo que estoy tratando de hacer es crear un procedimiento almacenado para que pueda pasar en códigos como "ON ME" y tienen que volver cada producto que contiene el "ON" o " YO "código. Como los códigos están separados por comas, no sé cómo puedo dividirlos y buscarlos. ¿Es esto posible usar solo TSQL?

Editar: Es una tabla de misión crítica. No tengo la autoridad para cambiarlo.

Respuesta

4

La forma en que está almacenando los datos rompe las reglas de normalización. Solo se debe almacenar un solo valor atómico en cada campo. Debe almacenar cada elemento en una sola fila.

+0

Lamentablemente, no lo diseñé. Ya existe, así que tengo que lidiar con eso. –

+0

Si está trabajando en el sistema ahora, ¿no tiene la autoridad para cambiarlo? Incluso si obtiene una solución a su problema, no funcionará bien por mucho más que pequeños conjuntos de datos. – JohnFx

+0

No tengo la autoridad para cambiarlo. Es una mesa de misión crítica. –

0

Esto podría no ser posible si usted está atrapado en que el diseño de la base de datos, pero sería mucho más fácil de poner los códigos en registros separados en otra tabla:

ProductCode 
----------- 
ProductID (FK to Product.ID) 
Code (varchar) 

La tabla podría tener este aspecto :

ProductID Code 
----------------- 
0001   IN 
0001   ON 
0001   ME 
... 

la consulta sería algo como esto (que tendría que pasar en los Códigos de alguna manera - ya sea como variables independientes, o tal vez una cadena separada por comas que se divide en el proc):

select ProductID 
from ProductCode 
where Code in ('ON', 'ME') 
11

Debe almacenar los códigos en una tabla separada, ya que tiene una relación de muchos a muchos. Si los separa, entonces podrá verificar fácilmente.

Se podría hacer en el tipo de sistema que tiene ahora, pero requeriría la búsqueda de texto de las columnas, con múltiples búsquedas por fila para trabajar, lo que tendrá enormes problemas de rendimiento a medida que crezcan sus datos.

Si intenta bajar la ruta actual: Deberá separar la cadena de entrada, porque nada garantiza que los códigos en cada registro estén en el mismo orden (o contiguo) que el parámetro de entrada. Entonces tendría que hacer una consulta

Code LIKE '%IN%' 
AND Code Like '%QA%' 

con una declaración adicional para cada código que está buscando. Muy ineficiente.

La idea de UDF a continuación también es una buena idea. Sin embargo, dependiendo del tamaño de sus datos y la frecuencia de consultas y actualizaciones, es posible que también tenga problemas allí.

¿sería posible crear una tabla adicional que esté normalizada y sincronizada de forma programada (o basada en un desencadenante) para su consulta?

5

Aunque todos los carteles anteriores son correctos acerca de la normalización de su esquema db, puede hacer lo que desee utilizando una "UDF con valores de tabla" que toma una cadena delimitada y devuelve una tabla, con una fila por valor en el string ... Puede usar esta tabla como lo haría con cualquier otra tabla en su proceso almacenado, uniéndose a ella, etc. Esto resolverá su problema inmediato ...

Aquí hay un enlace a un archivo UDF como: FN_Split UDF

Aunque el artículo habla sobre el uso que se cumpla una lista delimitada de valores de datos a un procedimiento almacenado, puede utilizar el mismo UDF para operar en una cadena delimitada almacenado en una columna de una tabla existente ...

7

Todo el mundo parece muy ansioso por decirte que no debes hacer esto, aunque no veo ninguna explicación explícita de por qué no.

Además de romper las reglas de normalización, la razón es que hará un escaneo de tabla en todas las filas, ya que no puede tener un índice en los "valores" individuales en esa columna.

En pocas palabras, no hay forma de que el motor de la base de datos guarde algún tipo de lista rápida de las filas que contienen el código 'AC', a menos que la divida en una tabla separada o la coloque en una columna sí mismo.

Ahora, si tiene otros criterios en sus instrucciones SELECT que limitarán el número de filas a un número manejable, entonces quizás esto estará bien, pero de lo contrario, si pudiera, trataría de evitar esta solución y haz lo que otros ya te han dicho, divídelo en una tabla separada.

Ahora, si usted está atascado con este diseño, se puede hacer una búsqueda utilizando el siguiente tipo de consulta:

... 
WHERE ',' + Code + ',' LIKE '%,AC,%' 

Esto hará lo siguiente:

  • Match 'EN, VI, AC , ZO'
  • no coincide 'eN, VI, TAC, ZO'

no sé si la última es una opción viable en su caso, f es suficiente con códigos de 2 letras, entonces usted puede utilizar esto:

... 
WHERE Code LIKE '%AC%' 

Pero, de nuevo, esto llevará a cabo horriblemente a menos que limita el número de filas que utilizan otros criterios.

+0

No si esa es toda mi respuesta que ha leído, no, eso es completamente correcto. Por favor, vuelva a leer mi SQL y considere por qué lo escribí de la manera en que lo hice. –

+0

Spoiler para lectores inobservantes: agrega comas al principio y al final del campo 'Código', * luego * usa el predicado LIKE en él. –

+0

Y funcionará de forma horrible, pero no por el hecho de que agregue comas en ambos lados de la cláusula LIKE. –

8

En primer lugar, vamos a hacer la tabla original para convertirse de esta manera:


Id | Value 
-----+------ 
0001 | IN 
0001 | ME 
0001 | OH 
0001 | ON 
0002 | AC 
0002 | ON 
0002 | VI 
0002 | ZO 
0003 | ME 
0003 | OO 
0003 | PS 
0003 | QA 

Esto se logra mediante el análisis de los valores separados por comas en filas. A continuación, utilice la potente palabra clave CROSS APPLY para unirse a la tabla original y recuperar su Id. El siguiente paso es simplemente consultar este CTE.


create function FnSplitToTable 
(
    @param nvarchar(4000) 
) 
returns table as 
return 
    with 
    Num(Pos) as -- list of positions, numbered from 1 to 4000, largest nvarchar 
    (
     select cast(1 as int) 
     union all 
     select cast(Pos + 1 as int) from Num where Pos < 4000 
    ) 
    select substring(@Param, Pos, 
     charindex(',', @Param + ',', Pos) - Pos) as Value 
     from Num where Pos <= convert(int, len(@Param)) 
     and substring(',' + @Param, Pos, 1) = ',' 
go 


create proc ProcGetProductId 
(
    @Codes nvarchar(4000) 
) 
as 
with 
Src 
(
    Id, 
    Code 
) 
as 
(
    select '0001', 'IN,ON,ME,OH' 
    union all 
    select '0002', 'ON,VI,AC,ZO' 
    union all 
    select '0003', 'QA,PS,OO,ME' 
), 
Parse as 
(
    select 
     s.Id, 
     f.Value 
    from 
     Src as s 
    cross apply 
     FnSplitToTable(s.Code) as f 
) 
select distinct 
    p.Id 
from 
    Parse as p 
join 
    FnSplitToTable(@Codes) as f 
on 
    p.Value = f.Value 
option (maxrecursion 4000) 
go 

exec ProcGetProductId 'IN,ME' -- returns 0001 & 0003 
+1

de todas las respuestas a esta pregunta, la tuya es la única * respuesta * – ninegrid

+2

de todas las publicaciones que hice, eres la primera en comentar. ¡Gracias! :) –

+2

se alegrará más tarde de haber hecho esto – BlackTigerX

0

Estoy de acuerdo con otros críticos aquí que usted debe buscar cuidadosamente en la normalización del esquema, pero también sé que los atajos son parte de la vida.

Aquí es una función de ejemplo escrito en Sybase dialecto que hace lo que hace:

ALTER FUNCTION "DBA"."f_IsInStringList"(IN @thisItem char(2), IN @thisList varchar(4000)) 
RETURNS INTEGER 
DETERMINISTIC 
BEGIN 


DECLARE is_member bit; 
DECLARE LOCAL TEMPORARY TABLE tmp (thisItem char(2)) ; 
DECLARE @tempstring varchar(10); 
DECLARE @count integer; 

IF LENGTH(TRIM(@thisList)) > 0 THEN 

    WHILE LENGTH(TRIM(@thisList)) > 0 LOOP 
     -- loop over comma-separated list and stuff members into temp table 
     IF LOCATE (@thisList, ',' , 1) > 0 THEN 

      SET @count = LOCATE (@thisList, ',' , 1); 
      SET @tempstring = SUBSTRING (@thisList, 1,@count-1); 

      INSERT INTO tmp (thisItem ) VALUES ( @tempstring); 
      SET @thisList = STUFF (@thisList, 1, @count, '') 

     ELSE 

      INSERT INTO tmp (thisItem ) VALUES (@thisList); 
      SET @thisList = NULL; 

     END IF; 

    END LOOP ; 

END IF; 

IF EXISTS (SELECT * FROM tmp WHERE thisItem = @thisItem) THEN 
    SET is_member = 1; 
ELSE 
    SET is_member = 0 ; 
END IF ; 

    RETURN is_member; 
END 

A continuación, puede crear una consulta sencilla de comprobar si un valor se produce en su separada por comas cadena:

select * from some_table t 
     WHERE f_IsInStringList('OR', t.your_comma_separated_column) = 1 OR 
       f_IsInStringList('ME', t.your_comma_separated_column) = 1 
4

Hace más de 1 año, pero aún así pensé que sería útil. Puede usar la función FIND_IN_SET de MySql. No estoy seguro de si otros DBMS lo admiten o no.

Se puede utilizar esta función como sigue:

SELECT * FROM `table_name` WHERE FIND_IN_SET('AC', `Code`) > 0 
0

1er paso: Código para crear la función

<font face="Courier New" size="2"> 
<font color = "blue">CREATE</font>&nbsp;<font color = "blue">FUNCTION</font>&nbsp;<font color = "maroon">[dbo]</font><font color = "silver">.</font><font color = "#FF0080"><b>[Udflistofids]</b></font>&nbsp;<font color = "maroon">(</font> 
<br/><font color = "green"><i>&#45;&#45;&nbsp;Add&nbsp;the&nbsp;parameters&nbsp;for&nbsp;the&nbsp;function&nbsp;here</i></font> 
<br/><font color = "#8000FF">@ListOfIDs</font>&nbsp;<font color = "blue">AS</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "maroon">max</font><font color = "maroon">)</font> 
<br/><font color = "green"><i>&#45;&#45;,&nbsp;@IDsSeperationChar&nbsp;as&nbsp;varchar(5)&nbsp;=&nbsp;','</i></font> 
<br/><font color = "silver">,</font> 
<br/><font color = "#8000FF">@UniqueID1</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/><font color = "#8000FF">@UniqueID2</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/><font color = "#8000FF">@UniqueID3</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/><font color = "#8000FF">@UniqueID4</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/><font color = "#8000FF">@UniqueID5</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "maroon">)</font> 
<br/><font color = "maroon">returns</font>&nbsp;<font color = "#8000FF">@TabListOfIDs</font>&nbsp;<font color = "blue">TABLE</font>&nbsp;<font color = "maroon">(</font> 
<br/>&nbsp;&nbsp;<font color = "green"><i>&#45;&#45;&nbsp;Add&nbsp;the&nbsp;column&nbsp;definitions&nbsp;for&nbsp;the&nbsp;TABLE&nbsp;variable&nbsp;here</i></font> 
<br/>&nbsp;&nbsp;<font color = "maroon">id</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">50</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;<font color = "maroon">uniqueid1</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;<font color = "maroon">uniqueid2</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;<font color = "maroon">uniqueid3</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;<font color = "maroon">uniqueid4</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;<font color = "maroon">uniqueid5</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">250</font><font color = "maroon">)</font><font color = "maroon">)</font> 
<br/><font color = "blue">AS</font> 
<br/>&nbsp;&nbsp;<font color = "blue">BEGIN</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "green"><i>&#45;&#45;&nbsp;Fill&nbsp;the&nbsp;table&nbsp;variable&nbsp;with&nbsp;the&nbsp;rows&nbsp;for&nbsp;your&nbsp;result&nbsp;set</i></font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">DECLARE</font>&nbsp;<font color = "#8000FF">@Pos</font>&nbsp;<font color = "blue">AS</font>&nbsp;<font color = "black"><i>INT</i></font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">DECLARE</font>&nbsp;<font color = "#8000FF">@ID</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">AS</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">50</font><font color = "maroon">)</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "#8000FF">@IDsSeperationChar</font>&nbsp;<font color = "blue">AS</font>&nbsp;<font color = "black"><i>VARCHAR</i></font><font color = "maroon">(</font><font color = "black">5</font><font color = "maroon">)</font>&nbsp;<font color = "silver">=</font>&nbsp;<font color = "red">','</font> 
<br/> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "green"><i>&#45;&#45;SET&nbsp;@ListOfIDs&nbsp;=&nbsp;REPLACE(&nbsp;@ListOfIDs,&nbsp;&nbsp;@IDsSeperationChar,&nbsp;',')</i></font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">SET</font>&nbsp;<font color = "#8000FF">@ListOfIDs</font>&nbsp;<font color = "silver">=</font>&nbsp;<font color = "fuchsia"><i>Ltrim</i></font><font color = "maroon">(</font><font color = "fuchsia"><i>Rtrim</i></font><font color = "maroon">(</font><font color = "#8000FF">@ListOfIDs</font><font color = "maroon">)</font><font color = "maroon">)</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "silver">+</font>&nbsp;<font color = "#8000FF">@IDsSeperationChar</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">SET</font>&nbsp;<font color = "#8000FF">@Pos</font>&nbsp;<font color = "silver">=</font>&nbsp;<font color = "fuchsia"><i>Patindex</i></font><font color = "maroon">(</font><font color = "red">'%'</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "#8000FF">@IDsSeperationChar</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "red">'%'</font><font color = "silver">,</font>&nbsp;<font color = "#8000FF">@ListOfIDs</font><font color = "maroon">)</font> 
<br/> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "green"><i>&#45;&#45;SET&nbsp;@Pos&nbsp;=&nbsp;CHARINDEX(@IDsSeperationChar,&nbsp;@ListOfIDs,&nbsp;1)</i></font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">IF</font>&nbsp;<font color = "fuchsia"><i>Replace</i></font><font color = "maroon">(</font><font color = "#8000FF">@ListOfIDs</font><font color = "silver">,</font>&nbsp;<font color = "#8000FF">@IDsSeperationChar</font><font color = "silver">,</font>&nbsp;<font color = "red">''</font><font color = "maroon">)</font>&nbsp;<font color = "silver">&lt;&gt;</font>&nbsp;<font color = "red">''</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">BEGIN</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">WHILE</font>&nbsp;<font color = "#8000FF">@Pos</font>&nbsp;<font color = "silver">&gt;</font>&nbsp;<font color = "black">0</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">BEGIN</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">SET</font>&nbsp;<font color = "#8000FF">@ID</font>&nbsp;<font color = "silver">=</font>&nbsp;<font color = "fuchsia"><i>Ltrim</i></font><font color = "maroon">(</font><font color = "fuchsia"><i>Rtrim</i></font><font color = "maroon">(</font><font color = "fuchsia"><i>LEFT</i></font><font color = "maroon">(</font><font color = "#8000FF">@ListOfIDs</font><font color = "silver">,</font>&nbsp;<font color = "#8000FF">@Pos</font>&nbsp;<font color = "silver">-</font>&nbsp;<font color = "black">1</font><font color = "maroon">)</font><font color = "maroon">)</font><font color = "maroon">)</font> 
<br/> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">IF</font>&nbsp;<font color = "#8000FF">@ID</font>&nbsp;<font color = "silver">&lt;&gt;</font>&nbsp;<font color = "red">''</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">BEGIN</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">INSERT</font>&nbsp;<font color = "blue">INTO</font>&nbsp;<font color = "#8000FF">@TabListOfIDs</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">(</font><font color = "maroon">id</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">uniqueid1</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">uniqueid2</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">uniqueid3</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">uniqueid4</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">uniqueid5</font><font color = "maroon">)</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">VALUES</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">(</font><font color = "#8000FF">@ID</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "#8000FF">@UniqueID1</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "#8000FF">@UniqueID2</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "#8000FF">@UniqueID3</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "#8000FF">@UniqueID4</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "#8000FF">@UniqueID5</font><font color = "maroon">)</font>&nbsp;<font color = "green"><i>&#45;&#45;Use&nbsp;Appropriate&nbsp;conversion</i></font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">END</font> 
<br/> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">SET</font>&nbsp;<font color = "#8000FF">@ListOfIDs</font>&nbsp;<font color = "silver">=</font>&nbsp;<font color = "fuchsia"><i>RIGHT</i></font><font color = "maroon">(</font><font color = "#8000FF">@ListOfIDs</font><font color = "silver">,</font>&nbsp;<font color = "fuchsia"><i>Len</i></font><font color = "maroon">(</font><font color = "#8000FF">@ListOfIDs</font><font color = "maroon">)</font>&nbsp;<font color = "silver">-</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "fuchsia"><i>Len</i></font><font color = "maroon">(</font><font color = "#8000FF">@ID</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "#8000FF">@IDsSeperationChar</font><font color = "maroon">)</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">)</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">SET</font>&nbsp;<font color = "#8000FF">@Pos</font>&nbsp;<font color = "silver">=</font>&nbsp;<font color = "fuchsia"><i>Patindex</i></font><font color = "maroon">(</font><font color = "red">'%'</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "#8000FF">@IDsSeperationChar</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "red">'%'</font><font color = "silver">,</font>&nbsp;<font color = "#8000FF">@ListOfIDs</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">)</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "green"><i>&#45;&#45;SET&nbsp;@Pos&nbsp;=&nbsp;CHARINDEX(@IDsSeperationChar,&nbsp;@ListOfIDs,&nbsp;1)</i></font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">END</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">END</font> 
<br/> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "blue">RETURN</font> 
<br/>&nbsp;&nbsp;<font color = "blue">END</font> 
<br/> 
<br/><font color = "maroon">go</font>&nbsp; 
</font> 


**2nd Step : Code to get the result** 

<font face="Courier New" size="2"> 
<font color = "blue">DECLARE</font>&nbsp;<font color = "#8000FF">@udvMax</font>&nbsp;<font color = "black"><i>NVARCHAR</i></font><font color = "maroon">(</font><font color = "maroon">max</font><font color = "maroon">)</font> 
<br/> 
<br/><font color = "blue">SELECT</font>&nbsp;<font color = "#8000FF">@udvMax</font>&nbsp;<font color = "silver">=</font>&nbsp;<font color = "red">''</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "fuchsia"><i>Substring</i></font><font color = "maroon">(</font>&nbsp;<font color = "maroon">(</font>&nbsp;<font color = "blue">SELECT</font>&nbsp;<font color = "red">'&nbsp;Union&nbsp;'</font>&nbsp;<font color = "silver">+</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "red">'Select&nbsp;*&nbsp;from&nbsp;dbo.udfListOfIDs('''</font>&nbsp;<font color = "silver">+</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "maroon">tmpu</font><font color = "silver">.</font><font color = "maroon">code</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "red">''',&nbsp;'''</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "maroon">tmpu</font><font color = "silver">.</font><font color = "maroon">id</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "red">''',&nbsp;'''</font>&nbsp;<font color = "silver">+</font>&nbsp;<font color = "maroon">tmpu</font><font color = "silver">.</font><font color = "maroon">code</font>&nbsp;<font color = "silver">+</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "red">''',&nbsp;null,null,null&nbsp;)'</font>&nbsp;<font color = "blue">FROM</font>&nbsp;<font color = "maroon">tmpu</font>&nbsp;<font color = "blue">FOR</font>&nbsp;<font color = "maroon">xml</font>&nbsp;<font color = "maroon">path</font><font color = "maroon">(</font><font color = "red">''</font><font color = "maroon">)</font><font color = "maroon">)</font><font color = "silver">,</font>&nbsp;<font color = "black">7</font><font color = "silver">,</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "black">200000</font><font color = "maroon">)</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "silver">+</font> 
<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color = "red">'&nbsp;Order&nbsp;by&nbsp;UniqueID1,&nbsp;UniqueID2,&nbsp;UniqueID3,&nbsp;UniqueID4,&nbsp;UniqueID5,&nbsp;ID'</font> 
<br/> 
<br/><font color = "green"><i>&#45;&#45;Select&nbsp;@udvMax</i></font> 
<br/><font color = "blue">EXECUTE</font>&nbsp;<font color = "#FF0080"><b>Sp_executesql</b></font> 
<br/>&nbsp;&nbsp;<font color = "#8000FF">@udvMax</font>&nbsp; 
</font> 

**** u Puede ser que tenga que añadir sus criterios de selección en declaración en el 2 ° paso. **

Espero que esto te ayude.

JP

0

si quiere hacerlo con php y mysql Puede ser cualquier numero de ninguna restricción

$var = explode(',',"ahmad,sayeed,asmal,babu"); 
$query = "SELECT * FROM post WHERE post_tags LIKE '%a%' "; 
$query1=NULL; 
foreach($var as $value) 
{ 
    $query1.= " OR post_tags LIKE '%$value%' "; 
} 

echo "$query $query1"; 

SALIDA:

SELECT * FROM post donde post_tags COMO '% a% 'OR post_tags LIKE '% Ahmad%' OR post_tags LIKE '% sayeed%' OR post_tags LIKE '% Asmal%' OR post_tags LIKE '% Babu%'

Cuestiones relacionadas