2014-09-08 2 views
0

Я использую SQL-сервер. У меня есть следующая таблицаSQL - выберите другую строку, если первая строка выбора возвращает пустую

Name Number 
A  123 
B  456 
C  789 
D  000 

Я даюсь 2 названия. Я хочу написать инструкцию sql, чтобы я мог проверить, существует ли первое имя в таблице.

  • Если это так, sql возвращает строку с первым именем.
  • Если нет, он проверяет второе имя. Если строка со вторым именем найдена, то вернет эту строку.
  • Если оба названия не найден, то возвращается пустая

Например,

  • если 'A', 'C' заданы, то оператор SQL должен возвращать строку с названием «A ' только.
  • Если заданы «G», «B», он должен сначала проверить «G», но не найти, а затем вернуть строку с именем «B», потому что она найдена.
  • если «X», «Y» заданы, то она должна возвращать пустую строку

Что такое SQL заявление наиболее эффективным но общим для достижения? (То, что я подразумеваю под «generic», это то, что я хочу написать оператор sql, который подходит для большинства типов Retional SQL DB, а не только для SQL-сервера)

Заранее благодарен!

ОБНОВЛЕНИЕ: Я подразумеваю возврат «без строк» ​​при произнесении «пустой строки». Прошу прощения за неправильную формулировку.

+0

Как эти значения «дано» ?, как прикажете их? – Lamak

+1

не было бы проще сделать 'where name in ('a', 'b')' order by ... 'type вещь и выбросить строки, которые вы не хотите? –

+0

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

ответ

4

Вы можете сделать это без union all:

select top 1 t.* 
from table t 
where name in (@name1, @name2) 
order by (case when name = @name1 then 1 else 0 end) desc; 
+0

Разве вы не хотите, чтобы еще 2? То, как оно закодировано здесь, было бы name2 наверху. –

+0

Мне кажется, это самый простой способ сделать это. – Joey

+1

@SeanLange Он использует 'desc', это делает трюк, никакой опечатки, я думаю. – Horaciux

5
select top 1 number from (

select 1 pos, number where name [email protected] 
union all 
select 2, number where name= @b) 
order by pos 
+1

Вы должны указать столбец порядка сортировки алиас и порядок псевдоним. Заказ по порядковым позициям очень опасен. –

+0

Там мы идем. Это выглядит хорошо для меня. :) –

+0

@SeanLange исправил, но никогда не слышал об этой опасности. Любая ссылка? Спасибо – Horaciux

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