Ir al contenido
wannacode

Funciones de texto

En resumen: En SQLite, las funciones de texto unen texto con ||, lo miden con LENGTH, lo cortan con SUBSTR, encuentran una posición con INSTR y lo limpian con REPLACE y TRIM.

Problema

Las etiquetas de los estantes

La tienda imprime etiquetas para los estantes: el nombre del producto y el precio, como «Pan blanco (1,20 €)». El nombre está en una columna y el precio en otra. Necesitas una columna con el texto terminado, para mandarla directamente a la impresora.

La idea

Unir con ||

|| une texto. Los trozos pueden ser columnas, texto entre comillas o números:

SQLbase de datos: tienda

Casi. El número se convierte en texto solo, pero en su forma más corta: 1.2, con punto y sin el cero. Para una etiqueta hacen falta dos dígitos y una coma.

printf('%.2f', price) escribe el número con exactamente dos dígitos después del punto: 1.20. REPLACE(texto, qué, por qué) cambia el punto por una coma:

SQLbase de datos: tienda

Las funciones se anidan: REPLACE recibe el texto ya hecho de printf.

Más precisamente, para curiosos

printf es una función de SQLite. Desde la versión 3.38 también se llama format. En PostgreSQL para lo mismo existe to_char(price, 'FM990.00'), y en MySQL FORMAT(price, 2). Si la página sale en varios idiomas, es mejor que el número siga siendo un número y que el programa que muestra la página le dé el formato.

Pruébalo

El destinatario del correo

Los programas de correo muestran una dirección como «Maria Ivanova <maria.ivanova@example.com>». Haz una columna así para cada cliente y llámala recipient.

SQLbase de datos: tienda

Míralo

Falta una ciudad

El mensajero quiere una línea «nombre, ciudad» para cada cliente:

SQLbase de datos: tienda
1. ¿Por qué la línea de contacto de Boris Mitev es NULL?

Cuando una columna puede ser NULL, el texto unido también puede serlo. Cómo poner palabras en lugar de la ciudad que falta llega en la lección sobre CASE y COALESCE.

La idea

Partes del texto

Las funciones de texto que más usarás:

  • LENGTH(t): cuántos caracteres tiene.
  • SUBSTR(t, desde, cantidad): un trozo del texto. La cuenta empieza en 1.
  • INSTR(t, parte): la posición de la parte, o 0 si no está.
  • UPPER(t) y LOWER(t): mayúsculas y minúsculas.
  • REPLACE(t, qué, por qué) y TRIM(t), que quita los espacios del principio y del final.
SQLbase de datos: tienda

SUBSTR e INSTR juntos cortan el texto justo en el sitio correcto. El dominio de un correo es todo lo que va después de la @:

SQLbase de datos: tienda

TRIM hace falta cuando los datos vienen de un formulario o de una hoja de cálculo y alguien dejó un espacio:

SQLbase de datos: tienda

Pruébalo

Iniciales

Las tarjetas de fidelidad necesitan las iniciales del cliente: «M. I.» para Maria Ivanova. Muestra el nombre y las iniciales en una columna llamada initials.

SQLbase de datos: tienda

Míralo

UPPER y las letras acentuadas

El sitio web quiere una dirección para cada producto, como pan-blanco: minúsculas y un guion en lugar del espacio. REPLACE y LOWER lo hacen:

SQLbase de datos: tienda

Aquí funciona porque los nombres solo usan las letras de la A a la Z. Los UPPER y LOWER integrados de SQLite cambian solo esas letras latinas sencillas. Una letra con tilde, o un alfabeto entero distinto como el cirílico o el griego, se queda como está:

SQLbase de datos: tienda

No hay error, así que es fácil pasarlo por alto. Lo mismo vale para LIKE: ignora las mayúsculas solo en las letras de la A a la Z.

Más precisamente, para curiosos

PostgreSQL y MySQL con texto en UTF-8 cambian correctamente también las letras acentuadas y otros alfabetos. SQLite tiene una extensión (ICU) que enseña a UPPER, LOWER y LIKE todos los alfabetos, pero aquí no está disponible en el navegador. Por eso los programas que usan SQLite suelen guardar el texto de búsqueda en una columna aparte, ya en minúsculas, calculado por el programa.

Ejercicio

Dos tareas

1. En una etiqueta caben 18 caracteres. ¿Qué productos tienen un nombre más largo? Muestra el nombre y su longitud en una columna llamada length.

Los productos con un nombre de más de 18 caracteres:

SQLbase de datos: tienda

2. El nuevo sistema de acceso necesita un nombre de usuario: la parte del correo antes de la @. Muestra el correo y el nombre de usuario en una columna llamada username.

El correo y el nombre de usuario de cada cliente:

SQLbase de datos: tienda

Test

Ponte a prueba

1. ¿Qué da 'Pan' || ' ' || 'blanco'?
2. ¿Qué devuelve SUBSTR('Kashkaval', 1, 4)?
3. ¿Qué devuelve INSTR('Yogur', ' ')?
4. ¿Qué da UPPER('café') en SQLite?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·