2009-03-30 8 views
0

Ok, cela peut sembler un peu bizarre, mais ce que je dois faire est simple. J'ai une liste d'entreprises et chacune a une description. Le site est en 4 langues. Mon problème vient quand j'ai énuméré une entreprise en anglais, mais la personne qui est en charge de la traduction en français n'a toujours pas faire la traduction, j'ai donc simple:Changer le WHERE pour un select sur une seule ligne en fonction du contenu du champ

SELECT TOP(6) 
    company.name, 
    company.description, 
    company.address 
WHERE 
    langid=1 
ORDER BY 
    company.id DESC 

La vraie question est plus complexe , mais je pense que ce sera plus facile avec celui-ci de comprendre le problème. Ce que je dois faire est, quand la description est vide dans langid 2 alors montrez-moi le langid 1 comme langid 1 est toujours le premier qui sera ajouté. Je ne veux pas montrer le champ de description vide. Imaginez la rangée 1, la rangée 2, la rangée 3 et la rangée 5 ont une description pour langid 2 mais pas rangée 4 et rangée 6. Je dois montrer langid 2 pour les rangées le contenant mais langid 1 pour les rangées sans description .

Je sais que je pourrais probablement faire un certain temps avec un champ @i incrémentant et insérant les résultats un par un dans une table temporaire, mais y a-t-il une meilleure façon de le faire?

+0

Toutes les descriptions d'entreprise (dans n'importe quelle langue) sont-elles stockées dans la table d'entreprise? c.-à-d. il y a N dossiers d'entreprise pour une entreprise donnée? – edosoft

+0

Tous les champs communs sont en table d'entreprise, les champs multilingues sont dans une autre table (une ligne par langue, donc en théorie pour chaque ligne dans la société il y a 5 lignes dans la table multilingue) ... encore ne peut pas travailler sur le projet , je vais l'essayer probablement demain .... – George

Répondre

5

Cela fonctionnera à moins qu'il n'y ait lng1.name etc. (c'est-à-dire la variante de langue anglaise/de secours) manquante.

SELECT TOP(6) 
    COALESCE(lng2.name, lng1.name)    [name], 
    COALESCE(lng2.description, lng1.description) description, 
    COALESCE(lng2.address , lng1.address)  address 
FROM 
    company lng1 
    LEFT JOIN company lng2 ON 
    lng1.id  = lng2.id AND 
    lng1.langid = 1 AND 
    lng2.langid = 2 /* your "foreign language" id, e.g. a parameter */ 
WHERE 
    lng1.id IN (1,2,3,4,5,6) /* or whatever */ 
ORDER BY 
    lng1.id DESC 

Il ne remplacera pas non plus toute l'adresse avec la version anglaise/de secours si seulement une partie de la variante localisée est manquante. Seules les parties manquantes seront substituées.

+0

COALESCE était la première chose qui a surgi dans mon esprit aussi ... – Sung

+0

Je l'ai dans 2 tables tous les champs communs sont dans un tableau d'entreprise, les champs multilingues sont dans une autre table (une ligne par langue, donc en théorie pour chaque ligne dans l'entreprise il y a 5 lignes dans le multilingue) Puis-je toujours appliquer COALESCE pour le résoudre? comme le nom du champ est le même sur toutes les langues – George

+0

Bien sûr. COALESCE renvoie le premier de ses arguments qui n'est pas NULL. D'où viennent les arguments n'est pas pertinent. Un peu plus de détails dans votre question aurait été bien - l'information que vous utilisez deux tables vient un peu en retard. – Tomalak

Questions connexes