sql-server - T-SQL Where 语句 - 或者

标签 sql-server tsql linq-to-entities where-clause

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

我有以下结果集:

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

最佳答案

所以,这里的代码完全符合您示例中所写的内容。 您应该在客户端代码中确定特定文化 (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,该怎么办?

关于sql-server - T-SQL Where 语句 - 或者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2674721/

相关文章:

c# - 使用 linq-to-entities 将字符串转换为日期时间的大问题

c# - 在 LINQ 查询的选择部分调用方法

c# - Sqlcmd : Error: Microsoft ODBC Driver 17 for SQL Server : Login failed for user 'SA'

sql-server - mssql 的 UUID 疯狂

tsql - SQL从表中选择最大值

LINQ to Entities 无法识别方法 'System.String Format(System.String, System.Object, System.Object)'

sql-server - 部署项目时找不到 'ISServerExec.exe'的路径

sql - 仅当记录具有特定标签时才获取记录

sql - 如何在sql server数据库中查找常量的用法

sql - 尝试 FakeTable 同义词表时 tSQLt 失败