longitud hasta extraer especificos contar caracteres caracter campo cadena sql mysql

extraer - sql substring hasta un caracter



Devolviendo el primer carácter DISTINTO de un campo(MySQL) (3)

Lamento hacer esto, pero me di cuenta exactamente de lo que necesitaba hacer ahora.

SELECT DISTINCT LEFT(name, 1) FROM mydatabase

Esto devolvió una lista de los primeros caracteres distintos y distintos con los que comenzó cada fila de la columna. Agregué lo cambiado a lo siguiente para obtener la lista en orden alfanumérico:

SELECT DISTINCT LEFT(name, 1) as letter FROM mydatabase ORDER BY letter

Funciona de maravilla.

Me gustaría producir una lista de caracteres de todas las primeras letras de la columna en mi base de datos. El SQL a continuación muestra lo que me gustaría devolver.

SELECT DISTINCT first_character(name) FROM mydatabase

¿Hay una manera de hacer esto en MySQL?

EDITAR ¿Cuál es la ventaja de usar SUBSTRING en lugar de IZQUIERDA y viceversa?

EDITAR Actualmente hay alrededor de 1700 registros en la tabla y sigue creciendo.


Para su tabla actual de 1,700 filas, su solución está bien.

Si tiene como 100,000 filas, el DISTINCT puede volverse ineficiente.

Aquí está el artículo en mi blog que muestra cómo hacerlo de manera eficiente:

Esta solución emplea un índice en name . Saltará sobre las teclas de índice, seleccionando cada primera letra como máximo una vez.

Primero, necesitarás crear una función:

CREATE FUNCTION fn_get_next_code(initial INT) RETURNS INT NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE _next VARCHAR(200); DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL; SELECT ORD(SUBSTRING(name, 1, 1)) INTO _next FROM t_names WHERE name >= CHAR(initial + 1) ORDER BY name LIMIT 1; RETURN _next; END

Esta función, dado un código de una letra inicial, devuelve la primera letra inicial junto a la dada de su tabla.

Segundo, usa esta función en una consulta:

SELECT CHAR(@r) AS starting, @r := fn_get_next_letter(@r) AS next FROM ( SELECT @r := ORD(LEFT(MIN(name), 1)) ) vars, mytable WHERE @r IS NOT NULL

En cada iteración, la variable de sesión @r saltará a la siguiente letra de inicio usando un índice.

Esto será muy rápido, pero se paga solo si tienes cientos de miles de filas.

De lo contrario, simplemente utilice DISTINCT .


Suena simple:

select distinct substring(field,1,1) as char from mytable