2

我有一个名为 Fruits 的下表。

ID English Spanish German
1  Apple   Applice Apple-
2  Orange  --      --

如果程序通过 1 和英语,我必须返回“Apple”。我怎么能为此编写sql查询?谢谢你。

4

4 回答 4

5
select
    ID,
    case @Lang
        when 'English' then English 
        when 'Spanish' then Spanish
    end as Name
from Fruits
where ID = @ID;

或者,如果您有多个列可供选择,则可以使用 apply 这样您就不必编写多个 case 语句

select
    F.ID,
    N.Name,
    N.Name_Full
from Fruits as F
    outer apply (values
        ('English', F.English, F.English_Full),
        ('Spanish', F.Spanish, F.Spanish_Full)
    ) as N(lang, Name, Name_Full)
where F.ID = @ID and N.lang = @lang
于 2013-08-15T06:38:11.617 回答
2

首先你应该规范化数据库,以支持多语言,这意味着将表拆分为 2

表:

  1. Fruit(水果ID、通用名称等)
  2. Languages(LanguageID、LanguageName 等)
  3. FruitTranslations(水果 ID、语言 ID、本地化名称)

那么查询将只是对表 FruitTranslations 的简单查询...


如果您仍然想要查询,那么您可以使用动态 SQL,

DECLARE @cmd VARCHAR(MAX)
SET @Cmd = 'SELECT ' + @Language + 
           ' FROM Fruits WHERE ID = ''' + CONVERT(VARCHAR, @Id) + ''''
EXEC(@Cmd)
于 2013-08-15T06:41:29.793 回答
2

试试这个——

DECLARE 
      @Lang VARCHAR(10) = 'English'
    , @ID INT = 1

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
SELECT ' + @Lang + ' 
FROM dbo.Fruits 
WHERE ID = ' + CAST(@ID AS VARCHAR(4))

PRINT @SQL
EXEC sys.sp_executesql @SQL
于 2013-08-15T06:42:38.487 回答
0

您可以使用存储过程来做到这一点,因为在存储过程中您可以使用“if else”条件。前任:

@ID as int,@Lang as varchar(50)

if @Lang = 'English'
 begin
    select ID,English from Fruits where ID = @ID;
 end
else
  if @Lang = 'Spanish'
 begin
    select ID,Spanish from Fruits where ID = @ID;
 end

...

于 2013-08-15T06:35:49.567 回答