Autor Zpráva
Cup
Profil
Ahoj,
marně se snažím zprovoznit dotaz pro pohled, který by mi selectoval z databáze (postgres) překlady.

Tabulka translation obsahuje sloupecky id, key, value, id_cat_locale. Chci vybírat podle id_cat_locale. Například "select * from translation where id_cat_locale = 'cs_CZ'". Angličtina je defaultní jazyk a ne vše je přeloženo. Rád bych aby to vybralo všechny klíče, které obsahuje jazyk 'en_GB' a k tomu, pokud je obsah v češtině, tak překlady v češtině.

příiklad:
 select * from view_translations where id_cat_locale = 'cs_CZ'
 key | value | id_cat_locale 
 game | hra | cs_CZ  // je přeložen
 lang | language | en_GB  // tento klíč není v češtině přelozen
 play | hrat | cs_CZ // je přeložen
 
klíč který není přeložen obsahuje hodnotu z angličtiny - ve soupečku id_cat_locale by asi klidně mohla být hodnota cs_CZ. Bez toho by to ten select z pohledu nevybral.

Díky moc za radu jak to poskládat
tiso
Profil
Malo by to ísť nejak takto:
SELECT dt.key, COALESCE(lt.value, dt.value) AS value, COALESCE(lt.id_cat_locale, dt.id_cat_locale) AS id_cat_locale
FROM view_translations dt
LEFT JOIN view_translations lt
  ON dt.id_cat_locale = 'en_GB' AND lt.id_cat_locale = 'cs_CZ' AND dt.key = lt.key
GROUP BY dt.key

dt =  default translation
lt = locale translation
Cup
Profil
Diky, pokusil jsem se to sepsat, ale stale to nefunguje:

Pohled ze ktereho selectuji:

CREATE OR REPLACE VIEW view_translation AS 
 SELECT dt.msg_key,
    COALESCE(lt.msg_value, dt.msg_value) AS value,
    COALESCE(lt.id_cat_locale, dt.id_cat_locale) AS id_cat_locale
   FROM translation dt
     LEFT JOIN translation lt ON dt.id_cat_locale::text = 'en_GB'::text AND dt.msg_key::text = lt.msg_key::text;

nasledny dotaz (pro italštinu mám přidaný pouze jeden záznam, tedy by měl být jeden v italštině, zbytek v angličtině):
select * from view_translation where id_cat_locale = 'it_IT'
dotaz ale vrátí dva řádky s tou jednou hodnotou co tam mám zadanou v italštině, nic víc:

"index.description";"POPISEK ITALSTINA";"it_IT"
"index.description";"POPISEK ITALSTINA";"it_IT"

:-/
tiso
Profil
Zabudol som tú češtinu, doplnil som select, ale neviem či z toho spravíš view, asi musíš spraviť procedúru s parametrom
Cup
Profil
Ok, zkusim to z toho nejak vymyslet. Kazdopadne diky za popichnuti :].
tiso
Profil
Tú duplicitu riadkov som vyriešil cez GROUP BY
Cup
Profil
Nakonec presne se mi podarilo udelat presne to co jsem chtel. Upozornuji, ze tento dotaz se vola pouze jednou, vysledky jsou nasledne nacachovane. Asi neni moc vytuneny pro vykon, ale dela presne to co sem chtel. Tedy kartezsky soucin vsech klicu se vsemi jazyky. Tam kde u jazyku neni nastavena hodnota, se dotahne hodnota z anglictiny.

Treba nekomu pomuze. Ale jak rikam, je cachovany.

CREATE OR REPLACE VIEW view_translation AS 
WITH keys as (
    SELECT msg_key from translation where id_cat_locale = 'en_GB'
), locales AS (
        SELECT distinct id_cat_locale
        FROM translation        
)
select k.msg_key, 
 coalesce( 
 (select msg_value from translation t where id_cat_locale = l.id_cat_locale and msg_key = k.msg_key), 
 (select msg_value from translation t where id_cat_locale = 'en_GB' and msg_key = k.msg_key) 
 ) as msg_value,
 l.id_cat_locale 
from keys k, locales l

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: