我有一个语言表,想要检索所选语言的特定记录。但是,如果没有翻译,我想获得另一种语言的翻译。
TRANSLATIONS
TAG LANG TEXT
"prog1" | 1 | "Programmeur"
"prog1" | 2 | "Programmer"
"prog1" | 3 | "Programista"
"prog2" | 1 | ""
"prog2" | 2 | "Category"
"prog2" | 3 | "Kategoria"
"prog3" | 1 | "Actie"
"prog3" | 2 | "Action"
"prog3" | 3 | "Dzialanie"
PROGDATA
ID | COL1 | COL2
1 | "data" | "data"
2 | "data" | "data"
3 | "data" | "data"
如果我想根据表PROGDATA中的ID来翻译语言3,那么我可以这样做:
SELECT TEXT FROM TRANSLATIONS, PROGDATA
WHERE TRANSLATIONS.TAG="prog" & PROGDATA.ID
AND TRANSLATIONS.LANG=3
会给我:
的 “Programista”
的 “Kategoria”
的 “Dzialanie”
在语言1的情况下,我在第二条记录上得到一个空字符串:
的 “Programmeur”
的 “”
的 “Actie”
如何用例如语言2的翻译替换空字符串?
的 “Programmeur”
的 “类别”
的 “Actie”
我尝试在IIf()
函数中嵌套一个新的select查询,但这显然不起作用。
SELECT
IIf(TEXT="",
(SELECT TEXT FROM TRANSLATIONS, PROGDATA
WHERE TRANSLATIONS.TAG="prog" & PROGDATA.ID
AND TRANSLATIONS.LANG=2),TEXT)
FROM TRANSLATIONS, PROGDATA
WHERE TRANSLATIONS.TAG="prog" & PROGDATA.ID
AND TRANSLATIONS.LANG=3
答案 0 :(得分:0)
SWITCH
或CASE
声明可能效果很好。但试试这个:
SELECT
IIf(TEXT="",
(SELECT TEXT AS TEXT_OTHER FROM TRANSLATIONS, PROGDATA
WHERE TRANSLATIONS.TAG="prog" & PROGDATA.ID
AND TRANSLATIONS.LANG=2),TEXT) AS TEXT_FINAL
我正在使用TEXTOTHER
和TEXTFINAL
来减少字段名称的歧义。有时这会有所帮助。
您甚至可能需要将原则应用于表名:
(SELECT TEXT AS TEXT_OTHER FROM TRANSLATIONS AS TRANSLATIONS_ALT...
另外,请确保您的标准是正确的:空字符串,而不是空值。
IIf(TEXT="", ...
IIf(ISNULL(TEXT), ...
答案 1 :(得分:0)
您可以再次加入TRANSLATIONS表以获取“默认”翻译并在SELECT语句中使用CASE。
SELECT
CASE
WHEN ISNULL(Translation.TEXT,"") = "" THEN DefaultLang.TEXT
ELSE Translation.Text
END
FROM TRANSLATIONS AS DefaultLang,TRANSLATIONS as Translation, PROGDATA
WHERE
DefaultLang.TAG="prog" & PROGDATA.ID AND Translation.TAG="prog" & PROGDATA.ID
AND DefaultLang.LANG=2
AND Translation.LANG=3
答案 2 :(得分:0)
这是一个伪代码的想法...... 我尝试为返回的每个值添加checkEmpty函数。如果不为空,则返回相同的..如果为空则返回其他语言的新搜索。 当然,你需要贬低新值不再为空。
create function checkEmpty( @word varchar(10), @languageNumber integer) returns varchar(10)
as
begin
declare @newWord
declare @newlanguage
if @word <> '' then return @word else
begin
//select new language
case languageNumber of
3 then @newlanguage = 1;
2 then @newlanguage = 3;
1 then @newlanguage = 2;
//search new lenguage
@newWord= SELECT TEXT FROM TRANSLATIONS, PROGDATA
WHERE TRANSLATIONS.TAG="prog" & PROGDATA.ID
AND TRANSLATIONS.LANG=@newlanguage
return @newWord
end;
end;
// FUNCTION CALL
SELECT dbo.checkEmpty(TEXT) FROM TRANSLATIONS, PROGDATA
WHERE TRANSLATIONS.TAG="prog" & PROGDATA.ID
AND TRANSLATIONS.LANG=3
答案 3 :(得分:0)
我将@fossilcoder和@Smandoli的解决方案完全合并,并将其合并为一个解决方案:
SELECT
IIf (
NZ(TRANSLATION.Text,"") = "", DEFAULT.TEXT, TRANSLATION.TEXT)
FROM
TRANSLATIONS AS TRANSLATION,
TRANSLATIONS AS DEFAULT,
PROGDATA
WHERE
TRANSLATION.Tag="prog_" & PROGDATA.Id
AND
DEFAULT.Tag="prog" & PROGDATA.Id
AND
TRANSLATION.LanguageId=1
AND
DEFAULT.LanguageId=2
我从未想过在不同的别名
下两次引用表格