Filtrar cadenas que contengan más de "n" mayúsculas

Preguntado hace 1 año

Gabriel Molina
Editado hace 1 año
Votos
PositivosNegativosTotal
2 -1 1
85 Visualizaciones
Compártelo: Compártelo en twitterCompártelo en Facebook

Hola, quiero escribir un filtro a un campo de texto que me devuelva sólo los registros que contengan en ese campo más de "n" mayúsculas.

La aproximación que nos planteamos es crear una función dameNumeroMayusculas(varchar cadenaOriginal). Que tenga una constante con el valor de todas las mayúsculas "ABCDEFGHIJ..." y que se recorra caracter por caracter para ver si está contenido en la constante e irlos contando para finalmente devolver ese contador.

Luego la consulta sería algo así

select * from Tabla1 
where dameNumeroMayusculas(campo1) > @maximoMayusculas;

No parece muy óptimo :S ¿Se os ocurre una opción mejor?

Un saludo a todos.

Actualizando datos
Sigo sin entender el enunciado, he planteado una solucion, pero no se si es lo que pides Fernandoflorido hace 1 año
Hola, robenvanpersie, no sé qué más datos necesitas, tengo un campo nvarchar(50) que contiene nombres pero quiero poder detectarlos si tienen más de x mayúsculas. Gabriel Molina hace 1 año
posiblemente la entrada no sea aleatoria, por lo que nos podrias dar mas datos para refinar la busqueda Fernandoflorido hace 1 año

2 Respuestas

Hace 1 año

Ricardo González
Votos
PositivosNegativosTotal
3-12

Hola Gabriel,

Lo de utilizar una función me parece muy buena idea, pero yo en vez de recorrer la constante y el valor del campo, recorrería unicamente caracter por caracter el valor del campo y compararía su valor ASCII para que estuviera entre ASCII('A') y ASCII('Z').

Algo así sería:

for i in 1..length(texto) loop
   valor:=ASCII(substr(campo1,i,i+1));
   if (valor>valorA and valor<valorZ) then
      cantidad:=cantidad+1;
   end if;
end loop;

Saludos,

Ricardo

Cerrar

Suponiendo que el enunciado pida "devolver la cadena que contenga mas de n mayusculas", sería un recorrido parcial, cuando se alcanzan n mayusculas no es necesario seguir buscando. Además el bucle tendria varias modificaciones, valor mayor o igual que valorA, valor menor o igual que valorZ, y la inicializacion de cantidad fuera del bucle. Fernandoflorido hace 1 año
esto de óptimo no tiene nada !! Fernandoflorido hace 1 año
Tampoco, el error es usar dateNumeroMayusculas() Fernandoflorido hace 1 año

Hace 1 año

Fernandoflorido
Votos
PositivosNegativosTotal
0-1-1

dateNumeroMayusculas() no te sirve para nada, mejor hacer un solo recorrido, necesario, crear una tabla 2x2 donde cuentes el numero de veces que aparece cada caracter, y luego ajustas cuentas.

Cerrar

Es que no veo tu solución aplicada a lo que quiero hacer. Para que tu ejemplo fuera parecido sería dame todos los equipos de fútbol que tengan más de 2 jugadores cuyo dorsal contenga el número 5. Gabriel Molina hace 1 año
pues que en lugar de recorrer n veces, recorres una sola vez. El ejemplo, devolver los dorsales de todos los equipos de la liga española de fútbol que aparezcan al menos 15 veces (en 15 equipos distintos). Aquí n=15. Lo que propongo, pasar a todos los jugadores e ir contabilizando para cada número de dorsal, las veces que aparece. Y al final los que aparezcan 15 o mas veces, los imprimo por la salida. Orden constante. La solución que tienes, recorrer el listado de jugadores una vez por cada jugador. Esto sería la solución, si quisieras devolver para cada registro, el número de letras mayúsculas que aparecen mas de n veces. Seguramente el enunciado pregunta otra cosa. Fernandoflorido hace 1 año
¿podrías poner un ejemplo, aunque sea seudocódigo, porque no entiendo lo que dices? Gabriel Molina hace 1 año
incluso esto se podria optimizar, pero serian optimizaciones menores Fernandoflorido hace 1 año

Tu respuesta

Confirmación

Cerrar

Si sales ahora, perderás los cambios. ¿Estás seguro de querer salir?

Para participar en Babelias, debes estar convenientemente validado. Si ya eres usuario inicia sesión, si no lo eres, te puedes registrar.

Dar una respuesta

Trata de ser descriptivo, usa al menos 25 caracteres