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