es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Consulta SQL para buscar en un campo con separador de comas.

Tengo una tabla con la siguiente estructura, en SQL Server 2012 (simplificado para mostrar):

Id | Val
—-+———-
1 | 1, 2
2 | 1, 3
3 | 1
4 | 2, 3, 4

Tengo un procedimiento almacenado con una lista de @valIds que contiene todos los valores de Val que me gustaría solicitar, por ejemplo, 2, 3 o 3.

En el primer caso, me gustaría que se devuelvan las filas 1, 2 y 4 porque contienen 2 o 3.
En el segundo caso, me gustaría que se devuelvan las filas 2 y 4 porque contienen 3.

Aquí hay un fiddle para reproducir la estructura: http://sqlfiddle.com/#!18/ff399/2

No puedo entender cómo dividir el campo Val para buscar en él y obtener los resultados mencionados anteriormente. ¿Alguien puede ayudarme?

Ten en cuenta que el separador es Coma-Espacio, no solo Coma. No estoy seguro de si se puede utilizar STRING_SPLIT aquí.

Gracias

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para buscar valores en el campo Val usando una lista de valores suministrados en @valIds, puedes usar la función CHARINDEX para verificar si cada valor en la lista aparece en el campo Val. Aquí tienes un ejemplo de procedimiento almacenado:

    CREATE PROCEDURE GetValsByList
        @valIds NVARCHAR(MAX)
    AS
    BEGIN
        SELECT Id, Val
        FROM YourTable
        WHERE (
            ',' + @valIds + ',' LIKE '%,' + CONVERT(NVARCHAR(10), Id) + ',%' OR
            ',' + @valIds + ',' LIKE '%,' + CONVERT(NVARCHAR(10), Id) + ', %' OR
            ',' + Val + ',' LIKE '%,' + @valIds + ',%' OR
            CHARINDEX(', ' + @valIds + ',', ', ' + Val + ',', 0) > 0
        )
    END
    

    Este procedimiento almacenado verifica si el campo Id o el campo Val contiene alguno de los valores en @valIds. También verifica que @valIds esté rodeado de comas para evitar coincidencias parciales (es decir, buscar 3 también coincidiría con 33).

    Puedes llamar al procedimiento almacenado de la siguiente manera:

    EXEC GetValsByList '2, 3'
    

    Esto devolverá las filas 1, 2 y 4. Si llamas al procedimiento almacenado solo con 3, devolverá las filas 2 y 4.

Comments are closed.