AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 4776
Accepted
garik
garik
Asked: 2011-08-19 09:21:53 +0800 CST2011-08-19 09:21:53 +0800 CST 2011-08-19 09:21:53 +0800 CST

如何获取默认语言的文本

  • 772

我有这样的表: 在此处输入图像描述

语言表中的数据:

在此处输入图像描述

等文本表中的数据: 在此处输入图像描述

如果请求的语言存在,我必须返回文本;如果默认语言不存在,我必须返回文本。是否可以在一个查询中做到这一点(不while,请)?

代码:

DECLARE @CommentId  bigint = 1
--DECLARE @LanguageCode  nvarchar(2) = 'en' -- "english text" returns
DECLARE @LanguageCode  nvarchar(2) = 'ua'   -- nothing at this moment

SELECT
     t.CommentId
    ,t.TextId
    ,t.[Text]
    ,t.LanguageId
    ,RequestedLanguageId = @LanguageCode
FROM dbo.common_Text t 
    INNER JOIN dbo.common_LanguageType l 
        ON t.LanguageId = l.LanguageId
WHERE l.Code = @LanguageCode 
    AND t.CommentId = @CommentId

谢谢你。

添加:

如果代码请求“ua”(乌克兰语)文本,而这不是该语言的任何文本,那么它将搜索俄语文本。如果找到 - 好的,如果没有找到英文文本。语言列表可能会有所不同。

sql-server-2008 query
  • 1 1 个回答
  • 1298 Views

1 个回答

  • Voted
  1. Best Answer
    Nick Chammas
    2011-08-19T09:57:49+08:002011-08-19T09:57:49+08:00

    使用递归 CTE,此查询构建了一个包含所有语言的表,这些语言在其默认链中的某处指向具有所需注释的语言。它在具有所需注释的第一个默认值旁边显示每种语言。然后过滤此表,为您提供所选语言的第一个可用文本。

    DECLARE @CommentId BIGINT = 1;
    DECLARE @LanguageCode NVARCHAR(2) = 'en';
    
    WITH languages AS (
        -- base case: language has required comment
        SELECT 
              lt.LanguageId AS RootLanguageId
            , lt.LanguageId
            , lt.Code
            , lt.DefaultId
            , 0 AS Level
        FROM 
            dbo.common_LanguageType lt
        --WHERE
        --  lt.LanguageId = lt.DefaultId
        WHERE
            EXISTS (
                SELECT *
                FROM dbo.common_Text    t
                WHERE 
                        t.CommentId = @CommentId
                    AND t.LanguageId = lt.LanguageId
            )
        
        UNION ALL
        
        -- recursive case: language is not its own default and
        --                 does not have the required comment
        SELECT
              l_default.RootLanguageId
            , l.LanguageId
            , l.Code
            , l.DefaultId
            , l_default.Level + 1 AS Level
        FROM
                        dbo.common_LanguageType l
            INNER JOIN  languages               l_default
                ON l.DefaultId = l_default.LanguageId
        WHERE
                l.LanguageId <> l.DefaultId
            AND NOT EXISTS (
                SELECT *
                FROM dbo.common_Text    t
                WHERE 
                        t.CommentId = @CommentId
                    AND t.LanguageId = l.LanguageId
            )
    )
    SELECT t.Text
    FROM 
                    languages       l
        INNER JOIN  dbo.common_Text t
            ON  l.RootLanguageId = t.LanguageId
    WHERE
        l.Code = @LanguageCode
    ;
    

    试着跑步

    SELECT *
    FROM languages;
    

    如果您想了解递归 CTE 在做什么。我已经上传了一个脚本来创建表,插入一些示例数据,然后将上面的代码运行到 gist。

    • 6

相关问题

  • 连接不同地理区域的数据库的最佳实践

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve