2013-08-15 5 views
2

У меня есть следующая таблица с именем Fruits.Запрос из нескольких столбцов

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

Если программа проходит 1 и на английском языке, я должен вернуть «Яблоко». Как я могу написать запрос sql для этого? Спасибо.

+1

ли программа возвращает строку, которая является запрос SQL? вы можете включить часть программы в свой вопрос. –

+0

Привет, мне просто нужно вернуть правильное имя столбца, например. Выберите «Английский из Фруктов», где ID = 1, но если программа проходит испанский, запрос должен быть «Выбрать испанский из фруктов», я не знаю, как динамически выбирать столбец. Спасибо – TNA

+0

Поскольку вы хотите запросить данные, такие как 'English' или' Spanish', это хороший показатель того, что ваш дизайн таблицы неправильный. Вещи, которые вы хотите запросить, должны быть * значениями *, которые существуют * внутри * строк данных, а не в * именах столбцов. Таблица должна быть «ID, Язык, FruitName» и иметь по одной строке для каждого «Language», для каждого «ID». –

ответ

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

или, если у вас есть более чем один столбец, чтобы выбрать, вы можете использовать применять, так что вам не нужно писать несколько заявлений тематических

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 
+0

+1 - за хороший ответ – Devart

0

вы можете сделать это с помощью хранимых процедур, потому что в хранимых процедурах вы можете использовать условие «если еще». например:

@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 

...

+0

Такой подход не подходит для статистики. –

2

Fisrt вы должны нормализовать базу данных, чтобы Многоязычная поддержка, это означает, что разделить таблицу на 2

таблиц:

  1. Fruit (FruitID, GenericName, и т.д.)
  2. Languages (код_язык, LANGUAGENAME и т.д.)
  3. FruitTranslations (FruitID, код_язык, LocalizedName)

то запрос будет просто простой запрос к таблице FruitTranslations ...


Если вы все еще хотите запрос для этого, то вы можете использовать динамический SQL,

DECLARE @cmd VARCHAR(MAX) 
SET @Cmd = 'SELECT ' + @Language + 
      ' FROM Fruits WHERE ID = ''' + CONVERT(VARCHAR, @Id) + '''' 
EXEC(@Cmd) 
+0

+1 - за хороший ответ. – Devart

+1

этот путь подлежит sql-инъекции –

+0

Я бы предпочел не использовать динамический для этой задачи, особенно если @lang введен пользователем –

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 
+2

этот путь подлежит обработке sql –

+0

Я знаю это. Просто согласитесь с точкой зрения LLuis LL. – Devart

Смежные вопросы