在CASE WHEN语句中选择SELECT

时间:2014-08-12 12:19:59

标签: sql sql-server-2008

我有2个包含这样数据的表

元素

ID  Type  Value
------------------
1   Text  AAA
2   Image BBB
3   Video CCC

文本

ItemID  Language   Text
------------------------
AAA     English    Hi There!
AAA     French     Hi There in french!
DDD     English    Some other text

我想创建一个select语句,当来自Type表的Elements是' Text' select语句将从Texts表中提取文本值,文本必须限制为一个语言 所以结果将是

ID  Type  Value   Text
-----------------------
1   Text  AAA     Hi There in French! ---This text is only the 'French' text
2   Image BBB     NULL
3   Video CCC     NULL

修改

我想我能做到这一点:

SELECT *,
 CASE EE.[Type]
  WHEN 'Text' THEN (
     SELECT [Text] FROM Texts 
     WHERE ItemID=EE.Value
     AND LanguageID='English'
  ) END as Text
  FROM Elements EE
 WHERE EE.ID = 1

你能想出更好的解决方案吗?

3 个答案:

答案 0 :(得分:0)

为什么必须是一个案例?为什么不加入,最终游戏是什么?

SELECT type, value, language, text
FROM elements
LEFT JOIN texts ON value = itemID and elements.type = 'Text' and  LanguageID='English'

答案 1 :(得分:0)

这也可以帮到你。

SELECT      E.*,T.Texts
FROM        [Elements] E
LEFT JOIN   [Texts] T 
ON          E.Value = T.ItemID
WHERE       T.Language = 'French'

答案 2 :(得分:0)

如果选择的语言基于用户选择,我会选择像以前的人一样的东西,但只是参数:

SELECT      E.*,T.Texts
FROM        [Elements] E
LEFT JOIN   [Texts] T 
ON          E.Value = T.ItemID and T.Language = @Language

连接比子查询更快,也更容易读取。您应该尽可能避免使用子查询。如果您希望这样[使用CASE],我会选择以下内容:

SELECT *,
 CASE EE.[Type]
  WHEN 'Text' THEN  TT.Text
  END as Text
  FROM Elements EE
  LEFT JOIN Texts TT on EE.Value = TT.ItemId and TT.Language = @Language