Obtener el número de ocurrencias en una cadena en SQL Server

Para obtener el número de ocurrencias en una cadena en SQL Server, se puede conseguir con la siguiente instrucción:

(len('cadenaEntera') - DATALENGTH(replace('cadenaEntera', 'cadena_a_buscar', ''))) / len('cadena_a_buscar')

Donde ‘cadenaEntera’ es la cadena donde se desea buscar el número de ocurrencias y ‘cadena_a_buscar’ es el fragmento que se desea contar. Este fragmento puede ser de la longitud que se desee, no hace falta que sea de un único carácter. Lo que hace simplemente es quitar la cadena a buscar de la cadena original y luego obtener la diferencia de la longitud, para saber cuántos caracteres se ha eliminado. A continuación, este resultado lo divide entre la longitud de la cadena a buscar para averiguar cuántas veces aparece.

Por ejemplo, si se desea obtener el número de barras que contiene la cadena ‘343242/43242/34234/43224’, se podría obtener con la siguiente expresión.

(len('343242/43242/34234/43224') - DATALENGTH(replace('343242/43242/34234/43224', '/', ''))) / len('/')

El resultado en este caso sería 3. Así podemos contar caracteres en SQL Server, concretando qué carácter queremos contar. También podemos pasarle un campo concreto de una tabla.

5 comentarios en «Obtener el número de ocurrencias en una cadena en SQL Server»

  1. Hola, que tal?

    Les cuento que estoy tratando de hacer un query que me busque ocurrencias, algo parecido a esto:

    http://geeks.ms/blogs/ghernandez/archive/2009/02/12/encontrando-combinaciones-num-233-ricas-con-sql-server.aspx

    Estoy tratando de hacer una sentencia SQL que me busque en toda mi base de datos de unos 10 mil registros, cuantas ocurrencias de 2 o mas numeros se repiten en toda la base. Lo que quiero es buscar de forma automatica, y me muestre la cantidad de veces que se repiten TODAS las ocurrencias.

    La tabla que tengo es asi, tiene cargados numeros de 00 a 99:

    N1 N2 N3 N4 N5 N6
    01 02 03 04 05 06
    01 03 05 10 11 22
    03 05 10 11 22 33
    05 10 11 22 33 44
    05 06 11 22 33 44

    El query que estoy tratando de hacer, me tendria que dar un resultado similar a este:

    Repeticiones Numeros
    2_________01 03
    3_________03 05
    2_________11 22
    3_________11 22 33
    3_________05 10
    2_________11 22 33 44

    Ojala me puedan ayudar, pido disculpas si no se explicarme bien, y perdon te pido algo muy complicado, soy nuevo en sql.

    Muchas gracias

    Responder
    • Hola Franco,

      Bienvenido a la página! Como bien dices, es algo complicado, pero la verdad es que en el enlace que pones queda bastante claro. En ese enlace busca las parejas de valores que más se repiten, entiendo que la única diferencia con lo que quieres es que tu también quieres que te devuelva el número de ocurrencias de combinaciones de 3, 4, 5 y 6 números, no?

      No tengo el entorno para probarlo, pero intuyo que sería algo así. Lo primero, crear y rellenar la tabla DetailNumbers tal y como lo hace en ese ejemplo.

      Luego tienes una select de ejemplo que devuelve los pares de valores que más se repiten. Se trataría de ampliar esa select para que también devuelva grupos de 3, 4, 5 ó 6 números. Habría que añadir tantos cross join como cantidad de números quieres comprobar. Por ejemplo, para grupos de tres, quedaría algo así(puede que no sea exacto porque te la pongo sin probarla, pero se parecerá bastante):

      SELECT COUNT(DISTINCT T1.IdSerie) AS Coincidencias,T1.Number AS Number1,T2.Number AS Number2, T3.Number AS Number3
      FROM DetailNumbers T1
      CROSS JOIN DetailNumbers T2
      CROSS JOIN DetailNumbers T3
      WHERE T1.NumberT2.Number AND T1.NumberT3.Number AND T2.NumberT3.Number AND T1.Number<T2.Number AND T2.Number<T3.Number AND T1.IdSerie=T2.IdSerie AND T2.IdSerie=T3.IdSerie
      GROUP BY T1.Number,T2.Number, T3.Number
      ORDER BY Coincidencias DESC

      Fíjate en los cambios que he hecho de la select para grupos de 3 respecto a la de grupos de 2, ya que habría que ir añadiendo más o menos lo mismo para sacar la de 4 números a partir de esta de 3 y así sucesivamente.
      Pruébalo y ya nos cuentas, espero haberte servido de ayuda.
      ¡Ánimo!

      Responder
  2. Buenas tardes, tengo una base donde necesito contar cuantas COMAS tengo dentro de un campo, si son mas de dos es error, solo tiene que informar 1 coma, como podria hacerlo? muchas gracias

    Responder
    • Hola Fabian,
      Sería parecido al ejemplo de arriba, pero contando las comas (,).
      Con esta query, te devolvería el número de comas de nombre_campo. Ya sería compararlo si es >1 o no para marcarlo como error:

      select (len(nombre_campo) – DATALENGTH(replace(nombre_campo, ‘,’, »))) / len(‘,’)

      Espero haberte ayudado.
      Saludos!

      Responder
  3. Hola no entiendo porque colocas DATALENGTH en lugar de Len. Yo por ejemplo usando tu sentencia me sale números negativos, porque DATALENGTH me da un valor mayor que Len ya que cuenta los bytes.

    (len([Sentencia]) – DATALENGTH(replace([Sentencia], ‘UODS00.’, »))) / len(‘UODS00.’)
    Acá intento buscar en una columna que guarda sentencias hechas a la BD y busco cuantas tablas se llaman por sentencia.

    Responder

Deja un comentario

Pin It on Pinterest