Tengo una columna que tiene valores formateados como a, b, c, d. ¿Hay alguna manera de contar la cantidad de comas en ese valor en T-SQL?
sql-server
tsql
Orion Adrian
fuente
fuente
LTRIM
cadena alrededor de la siguiente maneraSELECT LEN(RTRIM(@string)) - LEN(REPLACE(RTRIM(@string), ',', ''))
:?Extensión rápida de la respuesta de cmsjr que funciona para cadenas de más que más caracteres.
Uso:
fuente
dbo.CountOccurancesOfString( 'blah ,', ',')
lo que devolverá 2 en lugar de 1 ydbo.CountOccurancesOfString( 'hello world', ' ')
fallará al dividir por cero.DATALENGTH()/2
También es complicado debido a los tamaños de caracteres no obvios. Mire stackoverflow.com/a/11080074/1094048 para obtener una forma simple y precisa.Puede comparar la longitud de la cadena con una donde se eliminan las comas:
fuente
Basándose en la solución de @ Andrew, obtendrá un rendimiento mucho mejor utilizando una función de tabla de valores no procesal y APLICACIÓN CRUZADA:
fuente
La respuesta de @csmjr tiene un problema en algunos casos.
Su respuesta fue hacer esto:
Esto funciona en la mayoría de los escenarios, sin embargo, intente ejecutar esto:
Por alguna razón, REPLACE elimina la coma final, pero TAMBIÉN el espacio justo antes (no estoy seguro de por qué). Esto da como resultado un valor devuelto de 5 cuando esperarías 4. Aquí hay otra forma de hacerlo que funcionará incluso en este escenario especial:
Tenga en cuenta que no necesita usar asteriscos. Cualquier reemplazo de dos caracteres servirá. La idea es que alargue la cadena en un carácter para cada instancia del carácter que está contando, luego reste la longitud del original. Básicamente es el método opuesto de la respuesta original que no viene con el extraño efecto secundario de recorte.
fuente
fuente
La respuesta aceptada es correcta, extendiéndola para usar 2 o más caracteres en la subcadena:
fuente
Si sabemos que hay una limitación en LEN y espacio, ¿por qué no podemos reemplazar el espacio primero? Entonces sabemos que no hay espacio para confundir a LEN.
fuente
fuente
Darrel Lee creo que tiene una respuesta bastante buena. Reemplace
CHARINDEX()
conPATINDEX()
, y también puede hacer unaregex
búsqueda débil a lo largo de una cadena ...Como, digamos que usa esto para
@pattern
:¿Por qué querrías hacer algo loco como esto?
Digamos que está cargando cadenas de texto delimitadas en una tabla de etapas, donde el campo que contiene los datos es algo así como un varchar (8000) o nvarchar (max) ...
A veces es más fácil / rápido hacer ELT (Extract-Load-Transform) con datos en lugar de ETL (Extract-Transform-Load), y una forma de hacerlo es cargar los registros delimitados tal como están en una tabla de etapas, especialmente si Es posible que desee una forma más simple de ver los registros excepcionales en lugar de tratarlos como parte de un paquete SSIS ... pero esa es una guerra santa para un hilo diferente.
fuente
Lo siguiente debería hacer el truco para las búsquedas de caracteres únicos y múltiples:
La función se puede simplificar un poco usando una tabla de números (dbo.Nums):
fuente
Use este código, está funcionando perfectamente. He creado una función sql que acepta dos parámetros, el primer parámetro es la cadena larga que queremos buscar en él, y puede aceptar una longitud de cadena de hasta 1500 caracteres (por supuesto, puede extenderlo o incluso cambiarlo al tipo de datos de texto ) Y el segundo parámetro es la subcadena que queremos calcular el número de su ocurrencia (su longitud es de hasta 200 caracteres, por supuesto, puede cambiarlo a lo que necesite). y la salida es un número entero, representa el número de frecuencia ..... disfrútalo.
fuente
Finalmente escribo esta función que debería cubrir todas las situaciones posibles, agregando un prefijo y sufijo char a la entrada. Este carácter se evalúa como diferente de cualquiera de los caracteres contenidos en el parámetro de búsqueda, por lo que no puede afectar el resultado.
uso
fuente
fuente
En SQL 2017 o superior, puede usar esto:
fuente
Este código T-SQL encuentra e imprime todas las apariciones del patrón @p en la oración @s. Puedes hacer cualquier procesamiento en la oración después.
el resultado es: 1 6 13 20
fuente
para SQL Server 2017
fuente
Puede usar el siguiente procedimiento almacenado para obtener valores.
fuente
@c1
la respuesta que requiere. ¿De qué sirve el resto del código, considerando que necesita una tabla preexistente llamadatable1
al trabajo, tiene un delimitador codificado y no puede usarse en línea como la respuesta aceptada de dos meses antes?La prueba Reemplazar / Len es linda, pero probablemente muy ineficiente (especialmente en términos de memoria). Una función simple con un bucle hará el trabajo.
fuente
Quizás no debería almacenar datos de esa manera. Es una mala práctica almacenar una lista delimitada por comas en un campo. Es muy ineficiente para las consultas. Esta debería ser una tabla relacionada.
fuente