por - substring date mysql
Último índice de una subcadena dada en MySQL (6)
@Marc B estaba cerca. En MySQL, la siguiente declaración devuelve 12:
SELECT LENGTH("Have_a_good_day") - LOCATE(''_'', REVERSE("Have_a_good_day"))+1;
Anticipando un posible uso del valor, la siguiente declaración extrae la parte izquierda de la cadena antes del último guión bajo (es decir, _):
SELECT LEFT("first_middle_last", LENGTH("first_middle_last") - LOCATE(''_'', REVERSE("first_middle_last")));
El resultado es "first_middle". Si desea incluir el delimitador, use:
SELECT LEFT("first_middle_last", LENGTH("first_middle_last") - LOCATE(''_'', REVERSE("first_middle_last"))+1);
Sería bueno si mejoraran LOCALIZAR para tener una opción para iniciar la búsqueda desde la derecha.
Si desea la parte correcta de la cadena después del último espacio, una mejor solución es:
SELECT SUBSTRING_INDEX("first_middle_last", ''_'', -1);
Esto devuelve "último".
Podemos encontrar el índice de la primera aparición de una subcadena dada en MySQL usando la función INSTR()
siguiente manera.
SELECT instr(''Have_a_good_day'', ''_'') AS index_position
Mostrará 5
, la primera aparición de la subcadena especificada que es en este caso un guion bajo _
.
Necesito obtener la última ocurrencia de un determinado carácter (o una subcadena) algo así como el lastIndexOf(String str)
Java lastIndexOf(String str)
de la clase String pero no puedo encontrar ninguna función incorporada en MySQL.
¿Hay alguna funcionalidad incorporada para lograr esto en MySQL?
Combo de reversa / indexof?
SELECT LENGTH(string) - SUBSTRING_INDEX(REVERSE(string), delimiter) + 1
Have_a_good_day
, dado su Have_a_good_day
:
REVERSE(''Have_a_good_day'') -> yad_doog_a_evaH
SUBSTRING_INDEX(''yad_doog_a_evah'', ''_'') -> 4
LENGTH(''Have_a_good_day'') -> 15
15 - 4 + 1 -> 12
Have_a_good_day
123456789012345
^
Creo que puedes usar substring_index de esta manera:
select substring_index(string, delimiter,-1)
-1 comenzará al final de la cadena.
Encontré esto como un buen truco para hacerlo:
SELECT LOCATE(SUBSTRING_INDEX(''Have_a_good_day'', ''_'', -1),''Have_a_good_day'')-1 AS indexpos;
Esto devolverá el índice de la última ocurrencia (= 12). Básicamente busca la parte correcta de la cadena después del último delimitador y luego busca la posición de esta subcadena en toda la cadena, lo que le da la posición :)
Si desea obtener la subcadena a la izquierda de esto, puede usar:
SELECT
SUBSTRING(''Have_a_good_day'', 1,
LOCATE(SUBSTRING_INDEX(''Have_a_good_day'', ''_'', -1),''Have_a_good_day'')-1)
AS sub;
Si bien los códigos anteriores funcionan con éxito para un único carácter, fallaron cuando los usé para encontrar la última aparición de una subcadena. Por lo tanto, recomiendo el siguiente código para esta tarea:
SELECT LENGTH("my father is my father")
- LOCATE(''father'', REVERSE("my father is my father"))-(LENGTH(''father'')-1)
Esto debería regresar 17
Si no desea la sobrecarga de REVERSE, use lo siguiente:
LEFT
(
''Have_a_good_day'',
LENGTH(''Have_a_good_day'') - LENGTH(SUBSTRING_INDEX(''Have_a_good_day'',''_'',-1))-1
)