Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Capitalizar palabra en una frase de mysql menos las Palabras de 1 a 3 caracteres.

Estas en el tema de Capitalizar palabra en una frase de mysql menos las Palabras de 1 a 3 caracteres. en el foro de Mysql en Foros del Web. Buenas Tardes Amigos de Foros del Web, tengan un cordial saludo. Tengo un problemita y es el siguiente me encuentro haciendo una consulta mysql, se ...
  #1 (permalink)  
Antiguo 18/10/2012, 13:35
 
Fecha de Ingreso: octubre-2011
Ubicación: Niquitao
Mensajes: 28
Antigüedad: 8 años
Puntos: 0
Capitalizar palabra en una frase de mysql menos las Palabras de 1 a 3 caracteres.

Buenas Tardes Amigos de Foros del Web, tengan un cordial saludo.

Tengo un problemita y es el siguiente me encuentro haciendo una consulta mysql, se me pidió capitalizar la primer letra de cada palabra en un campo de mysql a excepción de las palabras de 1 a 3 caracteres, esas palabras si deben ir en minúsculas.

Por lo tanto tengo la tabla material la cual contiene los siguientes campos idmaterial, title el tipo de campo title es VARCHAR(128) y este es el campo que deseo capitalizar

Idmaterial----------------------- title
1---------------------------UNA PREGUNTA PARA CADA DÍA DEL AÑO QUE PASO
2---------------------------QUE DICCIONARIO USA PARA USUARIOS DE COMPUTADORAS DEL COLEGIO

Yo busque en este link: http://www.v3rgu1.com/blog/101/2010/bases-de-datos/letra-capital-con-sql/ esta es una función muy buena que hay que crearla; Cuya función después de crearla me capitaliza la primer letra de cada palabra de un campo específico, por ejemplo usando la función de ese link en una consulta sería así:

select UCWORDS2(title) from material where idmaterial = 1; Me arrojaría este resultado:

Idmaterial------------------------------title
1----------------------------Una Pregunta Para Cada Día Del Año Que Paso


Y aquí es donde entra mi problema no se debe capitalizar las palabras como “Una, Día, Del, Año”, por lo tanto pensé en una solución reemplazando las palabras buscandolas por texto completo, por ejemplo esta consulta me busca las palabras exactas por palabras:

SELECT * FROM material WHERE title like '% Del %' esta consulta busca la palabra completa con un espacio en blanco después del signo % y antes de la palabra; y otro espacio en blanco después de la palabra y antes del sigo % encontrando así solo esta palabras en una frase;

Idmaterial------------------------------title
1----------------------------Una Pregunta Para Cada Día Del Año Que Paso

Debe ser así la consulta pues se evita que se encuentren frases con palabras como “delicioso, delicado o delinear”, pero a la hora de actualizar este campo con esta instrucción:

UPDATE material SET title=REPLACE(title,'% Del %' ,' del ') no se actualiza esa fila;

Ahora como mi idea es actualizar en ese campo una lista de posibles palabras yo uso el case de esta forma:
UPDATE material set title=(
CASE
WHEN title LIKE '% Del %' THEN title = REPLACE(title,'% Del %',' del ')
WHEN title LIKE '% QUE %' THEN title = REPLACE(title,'% Que %',' que ')
ELSE title
END)

de esta forma actualizaría todos los registros donde tengan las palabras que especifique en esa lista, pero a la Hora de Ejecutar esta consulta, se actualizan todas las filas que tienen las palabras que especifico en esa lista, pero me cambia todo el texto por un “1”.

Idmaterial------------------------------title
1---------------------------------------1
2---------------------------------------1

No sé porque da este resultado.
Por lo tanto no sé qué error este cometiendo en esa consulta update o si me den una mejor sugerencia, para lograr el resultado esperado con la capitalización de Palabrasa excepción de las palabras de 1 a 3 caracteres.

Cualquier sugerencia será bienvenida.
Muchas Gracias.
  #2 (permalink)  
Antiguo 19/10/2012, 06:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 7 meses
Puntos: 574
Respuesta: Capitalizar palabra en una frase de mysql menos las Palabras de 1 a 3 cara

Código MySQL:
Ver original
  1. UPDATE material set title=REPLACE(title,' Del ',' del ')
  2. WHERE title LIKE '% Del %' ;

que tal esto....

Esta seria la sintaxis de lo que intentas pero claro el proceso puede ser largo....

Te pone 1 (true) por que esta haciendo la sustitución....creo

Luego intenta esto, he mejorado la sintaxis pero no se si funcionará

Código MySQL:
Ver original
  1. UPDATE material set title=(
  2.       WHEN title LIKE '% Del %' THEN REPLACE(title,' Del ',' del ')
  3.       WHEN title LIKE '% Que %' THEN REPLACE(title,' Que ',' que ')
  4. ELSE  title

No se que pasara con un titulo que tenga las dos cosas... p.e. "El Libro De Los Que No Saben" es decir no se si te va a hacer las dos substituciones....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 19/10/2012 a las 06:24
  #3 (permalink)  
Antiguo 19/10/2012, 08:49
 
Fecha de Ingreso: octubre-2011
Ubicación: Niquitao
Mensajes: 28
Antigüedad: 8 años
Puntos: 0
Respuesta: Capitalizar palabra en una frase de mysql menos las Palabras de 1 a 3 cara

Hola quimfv de verdad que tu ayuda me sirvio mucho ya hice las Actualizaciones necesarias y si como tú dijiste es un proceso mas largo por que definitivamente me toca especificar en la lista que palabras necesito modificar, pero lo interesante es que ya me actualiza las filas como yo deseo que se actualicen, además ya no pone esa actualización de 1 , si no que pone la palabra indicada.
hice la prueba con un título como el siguiente "Las Delicias Del Día, solo Del Colegio" y me arrojo este resultado "Las Delicias del Día, solo del Colegio" . no se actualizo Delicias y así es como yo lo necesitaba.

Estoy muy agradecido por tu valiosa ayuda, ya me toca crear a mi, una función que solo saque las palabras con longitud de 3 letras o menos, y a esas palabra solo las deje en minusculas.

Espero contar con tu ayuda para futuras preguntas.

Mil Gracias.

Última edición por elpropiopato23; 19/10/2012 a las 08:59
  #4 (permalink)  
Antiguo 19/10/2012, 12:29
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 12 años, 9 meses
Puntos: 447
Respuesta: Capitalizar palabra en una frase de mysql menos las Palabras de 1 a 3 cara

Hola elpropiopato23:

Por alguna razón no pude ver el código de la liga que pusiste en tu primer post, pero veamos, hace tiempo encontré una implementación para hacer más o menos lo que quieres:

http://www.thingy-ma-jig.co.uk/blog/...per-case-words

Sólo tuve que hacer algunos ajustes para considerar la longitud de las palabras menores a 3 caracteres:

Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP FUNCTION IF EXISTS `UC_FIRST`$$
  3.  
  4. CREATE FUNCTION UC_FIRST(oldWord VARCHAR(255)) RETURNS VARCHAR(255)
  5.   SET @regresar := oldWord;
  6.   IF LENGTH(oldWord) > 3 THEN
  7.     SET @regresar := CONCAT(UCASE(SUBSTRING(oldWord, 1, 1)),SUBSTRING(oldWord, 2));
  8.   END IF;
  9.   RETURN @regresar;
  10. END$$
  11.  
  12. DROP FUNCTION IF EXISTS UC_DELIMETER$$
  13.  
  14. CREATE FUNCTION UC_DELIMETER(oldName VARCHAR(255), delim VARCHAR(1), trimSpaces BOOL) RETURNS VARCHAR(255)
  15.   SET @oldString := LCASE(oldName);
  16.   SET @newString := "";
  17.  
  18.   tokenLoop: LOOP
  19.     IF trimSpaces THEN
  20.       SET @oldString := TRIM(BOTH " " FROM @oldString);
  21.     END IF;
  22.  
  23.     SET @splitPoint := LOCATE(delim, @oldString);
  24.  
  25.     IF @splitPoint = 0 THEN      
  26.         IF LENGTH(@newString) > 0 THEN
  27.           SET @newString := CONCAT(@newString, delim, UC_FIRST(@oldString));
  28.         ELSE
  29.           SET @newString := CONCAT(@newString, UC_FIRST(@oldString));
  30.         END IF;
  31.         LEAVE tokenLoop;        
  32.     END IF;
  33.  
  34.     IF LENGTH(@newString) > 0 THEN
  35.       SET @newString := CONCAT(@newString, delim, UC_FIRST(SUBSTRING(@oldString, 1, @splitPoint - 1)));
  36.     ELSE
  37.       SET @newString := CONCAT(@newString, UC_FIRST(SUBSTRING(@oldString, 1, @splitPoint - 1)));
  38.     END IF;
  39.     SET @oldString := SUBSTRING(@oldString, @splitPoint+1);
  40.   END LOOP tokenLoop;
  41.  
  42.   RETURN CONCAT(UCASE(SUBSTRING(@newString, 1, 1)),SUBSTRING(@newString, 2));
  43. END$$
  44. DELIMITER ;

La implementación quedaría entonces así:

Código MySQL:
Ver original
  1. mysql> SELECT UC_DELIMETER('uNA pRuEba PARA ver Si fUnCionA', ' ', FALSE);
  2. +-------------------------------------------------------------+
  3. | UC_DELIMETER('uNA pRuEba PARA ver Si fUnCionA', ' ', FALSE) |
  4. +-------------------------------------------------------------+
  5. | Una Prueba Para ver si Funciona                             |
  6. +-------------------------------------------------------------+
  7. 1 row in set (0.00 sec)

Dale un vistazo, pero creo que lo que necesitabas.

Saludos
Leo.
  #5 (permalink)  
Antiguo 22/10/2012, 15:09
 
Fecha de Ingreso: octubre-2011
Ubicación: Niquitao
Mensajes: 28
Antigüedad: 8 años
Puntos: 0
Respuesta: Capitalizar palabra en una frase de mysql menos las Palabras de 1 a 3 cara

Hola Nuevamente leonardo_josue:
Así Como siempre me has colaborado, y como siempre me quito el sombrero ante tu valiosa ayuda:

Te agradezco porque esta función soluciono mi problema y disculpa por no haber respondido el mismo viernes, tuvo que hacer otras consultas pero con esta ayuda salvaste mi día.
Mil Gracias Por tu colaboración, pues me colaboro a no tener que hacer una lista de todas las palabras posibles que tuvieran 3 caracteres o menos.
Espero seguir contando con su valiosa ayuda.

Hasta la próxima pregunta.
  #6 (permalink)  
Antiguo 22/10/2012, 15:33
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 12 años, 9 meses
Puntos: 447
Respuesta: Capitalizar palabra en una frase de mysql menos las Palabras de 1 a 3 cara

En realidad la mayor parte de la función ya estaba desarrollada, era sólo cuestión de hacer algunos ajustes, y la verdad me pareció interesante el planteamiento, me da gusto que te haya servido.

Saludos
Leo.

Etiquetas: frase, palabra, registros, select, sql, tabla, tipo, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:51.