Firebird: All matching words in word

PHOTO EMBED

Fri Feb 06 2026 13:52:40 GMT+0000 (Coordinated Universal Time)

Saved by @marcopinero #firebird #sql

CREATE OR ALTER FUNCTION ALL_MATCHING(
    TEXTO_ORIGINAL VARCHAR(1000),
    CADENA_BUSQUEDA VARCHAR(1000))
RETURNS BOOLEAN
AS
DECLARE VARIABLE palabra VARCHAR(100);
DECLARE VARIABLE pos INTEGER;
DECLARE VARIABLE encontrado BOOLEAN;
BEGIN
    -- Si la cadena de búsqueda está vacía, retornar verdadero
    IF (CADENA_BUSQUEDA IS NULL OR CADENA_BUSQUEDA = '') THEN
        RETURN TRUE;
    
    -- Convertir a mayúsculas para búsqueda insensible a mayúsculas/minúsculas
    TEXTO_ORIGINAL = UPPER(TEXTO_ORIGINAL);
    CADENA_BUSQUEDA = UPPER(TRIM(CADENA_BUSQUEDA));
    
    -- Si el texto original está vacío
    IF (TEXTO_ORIGINAL IS NULL OR TEXTO_ORIGINAL = '') THEN
        RETURN FALSE;
    
    -- Dividir la cadena de búsqueda en palabras y verificar cada una
    WHILE (CADENA_BUSQUEDA != '') DO
    BEGIN
        -- Extraer la siguiente palabra (separada por espacio)
        pos = POSITION(' ', CADENA_BUSQUEDA);
        IF (pos = 0) THEN
        BEGIN
            palabra = CADENA_BUSQUEDA;
            CADENA_BUSQUEDA = '';
        END
        ELSE
        BEGIN
            palabra = SUBSTRING(CADENA_BUSQUEDA FROM 1 FOR pos - 1);
            CADENA_BUSQUEDA = SUBSTRING(CADENA_BUSQUEDA FROM pos + 1);
        END
        
        -- Eliminar espacios adicionales
        palabra = TRIM(palabra);
        
        -- Si la palabra no está vacía, verificar si existe en el texto
        IF (palabra != '') THEN
        BEGIN
            encontrado = FALSE;
            
            -- Buscar la palabra como subcadena en el texto original
            IF (POSITION(palabra IN TEXTO_ORIGINAL) > 0) THEN
                encontrado = TRUE;
            
            -- Si una palabra no se encuentra, retornar falso
            IF (NOT encontrado) THEN
                RETURN FALSE;
        END
    END
    
    -- Si todas las palabras fueron encontradas
    RETURN TRUE;
END
content_copyCOPY