0

わかりました、これは少し奇妙に聞こえるかもしれませんが、私がしなければならないことは単純です。会社のリストがあり、それぞれに説明があります。このサイトは 4 か国語に対応しています。私の問題は、会社を英語でリストしたのに、それをフランス語に翻訳する担当者がまだ翻訳をしていない場合に発生するので、簡単に説明します。

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

実際のクエリはもっと​​複雑ですが、これで問題が理解しやすくなると思います。私がする必要があるのは、langid 2 で説明が空の場合、langid 1 が常に追加される最初のものであるため、langid 1 を表示することです。説明フィールドを空に表示したくありません。

行 1、行 2、行 3、および行 5 には langid 2 の説明がありますが、行 4 と行 6 には説明がありません。それを含む行には langid 2 を表示する必要がありますが、説明のない行には langid 1 を表示する必要があります。

@i フィールドをインクリメントして一時テーブルに結果を 1 つずつ挿入することで、おそらくしばらくできることはわかっていますが、それを行うためのより良い方法はありますか?

4

1 に答える 1

5

lng1.nameetc. (つまり、英語/フォールバック バリアント) が欠落していない限り、これは機能します。

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

また、ローカライズされたバリアントの一部のみが欠落している場合でも、アドレス全体を英語/フォールバック バージョンに置き換えることはありません。欠品部分のみの交換となります。

于 2009-03-30T11:41:30.317 に答える