将empty / null字符串替换为另一条记录的结果

时间:2013-12-06 17:40:56

标签: sql ms-access-2003

我有一个语言表,想要检索所选语言的特定记录。但是,如果没有翻译,我想获得另一种语言的翻译。

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

4 个答案:

答案 0 :(得分:0)

SWITCHCASE声明可能效果很好。但试试这个:

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 

我正在使用TEXTOTHERTEXTFINAL来减少字段名称的歧义。有时这会有所帮助。

您甚至可能需要将原则应用于表名:

(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

我从未想过在不同的别名

下两次引用表格