2

抱歉标题含糊,但我真的不知道给这个问题起什么标题:

我有以下结果集:

ID   Field   FieldValue   Culture
1    Color   Groen        nl-NL
2    Taste   Kip          nl-NL
3    Color   Green        en-GB
4    Taste   Chicken      en-GB
5    Color   Green        en
6    Taste   Chicken      en

我想模仿 ASP.Net 的资源选择方式,用户文化 (nl-NL)

SELECT Field, FieldValue FROM Tbl WHERE Culture = 'nl-NL'

或者当没有特定文化的结果时,尝试父文化 (nl)

SELECT Field, FieldValue FROM Tbl WHERE Culture = 'nl'

或者当没有父文化的结果时,尝试默认的文化 (en)

SELECT Field, FieldValue FROM Tbl WHERE Culture = 'en'

如何将这些 SELECT 语句组合到一个 T-SQL 语句中?
我正在使用 LINQ,所以 LINQ 表达式会更大。

OR 语句不起作用,因为我不想要混合文化。
ORDER BY 语句无济于事,因为它返回每种文化的多条记录。

输出可能类似于 (nl-NL):

Color   Groen
Taste   Kip

或 (en-GB / en):

Color   Green
Taste   Chicken
4

5 回答 5

4

因此,这里的代码完全符合您的示例中所写的内容。您应该在客户端代码中确定特定文化 (nl-NL)、中性文化 (nl) 和回退文化 (en),并将这些值提供给 SQL。

SELECT Field, FieldValue FROM Tbl WHERE Culture = (
    SELECT TOP 1 Culture FROM (
        SELECT 1 as n, Culture FROM Tbl WHERE Culture = 'nl-NL'
        UNION
        SELECT 2, Culture FROM Tbl WHERE Culture = 'nl'
        UNION
        SELECT 3, Culture FROM Tbl WHERE Culture = 'en'
    ) cultures
    ORDER BY n
)

你确定你需要给定文化的整个翻译表,而不是每个字符串的翻译吗?如果 en 中有字符串 A 和 B,但 nl-NL 中只有字符串 A,该怎么办?

于 2010-04-20T12:14:46.910 回答
2

试试这个:

SELECT Field, FieldValue FROM Tbl WHERE Culture = 'nl-NL' 

union

SELECT Field, FieldValue FROM Tbl WHERE Culture = 'nl' 
and not exists(select * from tbl where culture = 'nl-NL')

union

SELECT Field, FieldValue FROM Tbl WHERE Culture = 'en' 
and not exists(select * from tbl where culture = 'nl-NL')
and not exists(select * from tbl where culture = 'nl')

林克:

var x = (from a in tbl
        where culture == "nl-NL"
        select a
        )

        .Union

        (from a in tbl
        where culture == "nl"
        && !tbl.Any(c => c.Culture == "nl-NL")
        select a
        )

        .Union
        (from a in tbl
        where culture == "en"
        && !tbl.Any(c => c.Culture == "nl-NL")
        && !tbl.Any(c => c.Culture == "nl")
        select a
        );
于 2010-04-20T13:04:44.287 回答
1

假设文化正在@Culture 中传递:

select Field,COALESCE(fc.FieldValue,pc.FieldValue,dc.FieldValue)
from
    Tbl dc
        left join
    Tbl pc
        on
            dc.Field = pc.Field and
            pc.Culture = SUBSTRING(@Culture,1,CHARINDEX('-',@Culture)-1)
        left join
    Tbl fc
        on
            dc.Field = fc.Field and
            fc.Culture = @Culture
where
    dc.Culture = 'en'

将返回整个表(别名可能更长 - dc = 默认区域性,pc = 部分区域性,fc = 完整区域性。

于 2010-04-20T12:58:42.613 回答
0

给定目标文化返回完整匹配,或者在父级上失败匹配。(假设是文化字段中剩下的 2 个字符)

(更新)

-- @TargetCulture represents the culture we are interested in
DECLARE @TargetCulture varchar(5)
SET @TargetCulture = 'nl-NL'

-- Parent represents the Result_Set (as in OP) plus column for the 'parent' culture
;WITH Parent AS
(
    SELECT 
        *, 
        LEFT(Culture, 2) AS parent
    FROM 
        Result_Set
)
SELECT 
    * 
FROM 
    Parent
WHERE
    -- Get either a full matching culture or just a match on the parent
    (@TargetCulture = Culture AND @TargetCulture <> parent)
    OR
    (@TargetCulture <> Culture AND @TargetCulture = parent)

更改变量的值以检索、和@TargetCulture的区域性数据。nlen-GBen

于 2010-04-20T13:39:37.763 回答
0

另一种方法;

SELECT * FROM tbl WHERE tbl.Culture = (
 SELECT COALESCE(
  CASE WHEN EXISTS (SELECT 1 FROM tbl WHERE Culture = @locale) THEN @locale ELSE NULL END,
  CASE WHEN EXISTS (SELECT 1 FROM tbl WHERE Culture = SUBSTRING(@locale, 1, CHARINDEX('-', @locale + '-') - 1)) THEN SUBSTRING(@locale, 1, CHARINDEX('-', @locale + '-') - 1) ELSE NULL END,
  'en'
 )
)


nl-nl -> 'nl-nl'
en -> 'en'
en-xxx -> 'en'
zz-gg -> 'en'
en-gb -> 'en-gb'
ff -> 'en'
于 2010-04-20T16:27:28.680 回答