【问题标题】:Change the WHERE for a select on only one row depending on the field content根据字段内容更改仅在一行上选择的 WHERE
【发布时间】:2010-10-16 08:39:08
【问题描述】:

好的,这听起来可能有点奇怪,但我需要做的很简单。我有一份公司名单,每个公司都有描述。该网站有 4 种语言版本。我的问题是当我用英文列出了一家公司,但负责翻译法文的人仍然没有翻译,所以我有一个简单的:

SELECT TOP(6)
    company.name,
    company.description,
    company.address
WHERE
    langid=1
ORDER BY
    company.id DESC

真正的查询更复杂,但我认为使用这个查询会更容易理解问题。我需要做的是,当 langid 2 中的描述为空时,请向我显示 langid 1,因为 langid 1 始终是第一个添加的。我不想将描述字段显示为空。

想象一下第 1 行、第 2 行、第 3 行和第 5 行有 langid 2 的描述,但没有第 4 行和第 6 行。我需要为包含它的行显示 langid 2,但为没有描述的行显示 langid 1。

我知道我可以用 @i 字段递增并在临时表中一个一个地插入结果来做一段时间,但是有没有更好的方法呢?

【问题讨论】:

  • 是否所有公司描述(任何语言)都存储在公司表中?即给定公司有 N 条公司记录?
  • 所有常用字段都在公司表中,多语言字段在另一个表中(每种语言一行,所以理论上公司每1行多语言表中有5行)...仍然无法再次进行该项目,我可能会在明天尝试....

标签: sql tsql select multilingual case


【解决方案1】:

除非缺少 lng1.name 等(即英语语言/备用变体),否则这将起作用。

SELECT TOP(6) 
  COALESCE(lng2.name, lng1.name)               [name], 
  COALESCE(lng2.description, lng1.description) description, 
  COALESCE(lng2.address , lng1.address )       address
FROM 
  company lng1
  LEFT JOIN company lng2 ON 
    lng1.id     = lng2.id AND
    lng1.langid = 1 AND
    lng2.langid = 2  /* your "foreign language" id, e.g. a parameter */
WHERE
  lng1.id IN (1,2,3,4,5,6)  /* or whatever */
ORDER BY 
  lng1.id DESC

如果仅缺少部分本地化变体,它也不会用英文/备用版本替换整个地址。只有缺少的部分将被替换。

【讨论】:

  • 我有 2 个表,所有常见字段都在 company 表中,多语言字段在另一个表中(每种语言一行,所以理论上公司中的每 1 行有 5 行多语种)我仍然可以应用 COALESCE 来解决它吗?因为所有语言的字段名称都相同
  • 当然。 COALESCE 返回它的第一个非 NULL 参数。论点从何而来无关紧要。您的问题中更详细一点会很好 - 您使用两个表的信息来晚了一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2011-10-14
  • 2018-08-10
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多