Obtener todos los caracteres antes del espacio en MySQL

81

Me gustaría obtener todos los caracteres de un campo antes de un espacio.

Por ejemplo, si field1es"chara ters"

Quiero que vuelva "chara"

¿Cómo se vería esta declaración de selección?

Alex Gordon
fuente

Respuestas:

115

SELECT LEFT(field1,LOCATE(' ',field1) - 1)

Tenga en cuenta que si la cadena en cuestión no contiene espacios, esto devolverá una cadena vacía.

Mchl
fuente
6
Devuelve 'chara' con espacio final. Necesita disminuir el resultado de LOCATE si no necesita un separador al final: SELECT LEFT (field1, LOCATE ('', field1) - 1)
Enyby
1
Esto no funcionará si su campo principal no contiene espacio. La subcadena devolverá un valor vacío en lugar de devolver la cadena completa. Por ejemplo, si mi campo contiene la cadena "prueba-posible-nombre-incorrecto", la subcadena no devolverá nada en lugar de "prueba-posible-nombre-incorrecto".
Swapnil Gangrade
2
@SwapnilGangrade Dependiendo del caso de uso real, podría ser un comportamiento esperado o no. Se podría argumentar que si no hay espacio en la cadena, entonces no hay caracteres antes del espacio, por lo que se debe devolver una cadena vacía. Otra persona puede querer que se le devuelva una cadena completa en tal caso. La pregunta no especifica cómo debería comportarse la función en este caso límite. Actualizaré la respuesta para resaltarla.
Mchl
11
Entonces select SUBSTRING_INDEX( field1, ' ', 1 ) from table;será la elección si queremos tener una cadena completa si no hay espacio.
Swapnil Gangrade
2
La respuesta a continuación ( SUBSTRING_INDEX) es "mejor" como solución general porque conservará los valores que no contienen el delimitador, en lugar de dar como resultado un valor en blanco.
degenerado
88

A continuación se muestra otro método que funciona y puede parecer un poco más simple para algunos. Utiliza la función SUBSTRING_INDEX MySQL . Un 1 devuelve todo antes del primer espacio y un -1 devuelve todo lo que está después del último espacio.

Esto devuelve 'chara':

SELECT SUBSTRING_INDEX( field1, ' ', 1 )

Esto devuelve 'ters':

SELECT SUBSTRING_INDEX( field1, ' ', -1 )

Detalles

Un valor positivo buscará su carácter especificado desde el principio de la cadena, y un valor negativo comenzará desde el final de la cadena. El valor del número indica la cantidad de su carácter especificado que debe buscar antes de devolver la pieza restante de la cadena. Si el carácter que está buscando no existe, se devolverá el valor del campo completo.

En este caso, un -2 devolvería todo a la derecha del penúltimo espacio, que no existe en este ejemplo, por lo que se devolverá todo el valor del campo.

T. Brian Jones
fuente
3
Esto también funciona, si hay cadenas, sin un espacio en blanco, por ejemplo, 'chara' también funcionará.
bernhardh
2
Esto funcionó muy bien para obtener la versión mayor + menor de una cadena de versión con componentes xyz.
thomthom
4
Esto funciona mejor cuando desea que se devuelva todo el campo si no se pudo encontrar el carácter.
stephentgrammer
Utilizo esto para extraer coordenadas geográficas de un campo de cadena donde se garantiza que existe un delimitador (coma).
ob-ivan
11

Necesitarías algunas operaciones de cadena para eso. Suponiendo que cada campo tiene al menos un carácter de espacio:

SELECT SUBSTR(field1, 0, LOCATE(' ', field1)) FROM your_table;

Enfoque seguro:

SELECT IF(
    LOCATE(' ', field1),
    SUBSTR(field1, 0, LOCATE(' ', field1)),
    field1
) FROM your_table;
fusión de almas
fuente
+1 para la versión segura, aunque no está claro qué resultado debe devolverse cuando el campo no contiene un espacio en blanco.
Mchl
2
Tuvo que cambiar 0 por 1:SELECT SUBSTR(field1, 1, LOCATE(' ', field1)) FROM your_table;
Lluís