es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Respaldo en un diseño de base de datos multilingüe.

Estoy diseñando una base de datos multilingüe sobre productos, qué original 😉

Este es el diseño simplificado:

enter image description here

Si selecciono datos para ‘de’, ¿está vacío (NULL)?

select 
    p.id,
    p.price,
    pi.name,
    pi.description
from public.products p
inner join public.locales loc
on loc.lang = 'de'
left join public.products_i18n pi
on p.id = pi.id and pi.lang = loc.id

enter image description here

Me gustaría tener un respaldo en inglés cuando la configuración local requerida no esté presente:

select 
    p.id,
    p.price,
    coalesce(pi.name, pi_def.name),
    coalesce(pi.description, pi_def.description)
from public.products p
inner join public.locales loc
on loc.lang = 'de'
left join public.products_i18n pi
on p.id = pi.id and pi.lang = loc.id
left join public.products_i18n pi_def
on p.id = pi_def.id and pi_def.lang = '1' -- respaldo en inglés

Sin embargo, recibo dos filas: 1 fila con los datos de respaldo correctos (se espera que la descripción esté vacía) y 1 fila vacía.

screen from pgAdmin4

¿Es un problema de visualización con pgAdmin o mi consulta está incorrecta?

SQL fiddle disponible aquí:
http://sqlfiddle.com/#!17/485be/1

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece ser un problema de visualización con pgAdmin, ya que la consulta en sí parece estar correcta. El problema puede estar relacionado con la forma en que pgAdmin maneja los valores NULL en una unión izquierda. Una solución podría ser agregar una cláusula WHERE para filtrar la fila vacía:

    select 
        p.id,
        p.price,
        coalesce(pi.name, pi_def.name),
        coalesce(pi.description, pi_def.description)
    from public.products p
    inner join public.locales loc
    on loc.lang = 'de'
    left join public.products_i18n pi
    on p.id = pi.id and pi.lang = loc.id
    left join public.products_i18n pi_def
    on p.id = pi_def.id and pi_def.lang = '1' -- fallback a inglés
    where pi.id is not null or pi_def.id is not null -- Filtrar la fila vacía
    

    Esto debería garantizar que solo se devuelva la fila con datos reales.

Comments are closed.