Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Интересная задачка  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Добрый день.
Вот такая интересная задачку прочитал сегодня для ms sql 2005.
Есть 2 переменные одинакового типа a и b.
Как поменять в них значения местами,
при этом нельзя использовать никакие другие вспомогательные объекты.
нельзя использовать:
- третью перемнную
- любые типы таблиц(табл.), процедуры, функции и т.п.
Прошу варианты ответов.
18 окт 13, 18:26    [15000147]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Гость333
Member

Откуда:
Сообщений: 3683
+ Вариант ответа
SELECT @a = @b, @b = @a
18 окт 13, 18:31    [15000168]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Баян.

http://www.quizful.net/interview/problems/swap-without-temp-var
18 окт 13, 18:31    [15000169]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
declare
    @a int = 1, @b int = 2
    
select @a, @b

; with a as ( select a = @a, b = @b )
select
    @a = b 
    , @b = a
from a
    
select @a, @b
18 окт 13, 18:35    [15000185]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Гость333,

некатит - после тагого они обе будут равны значению @a

declare @a int, @b int
set @a = 1
set @b = 2

select 'ДО: ', @a '@a', @b '@b'

select @b = @a, @a = @b

select 'ПОСЛЕ: ', @a '@a', @b '@b'
18 окт 13, 18:35    [15000189]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Jaffar
Member

Откуда:
Сообщений: 633
[quot Гавриленко Сергей Алексеевич][src sql]

а без CTE?
18 окт 13, 18:38    [15000196]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Jaffar
Member

Откуда:
Сообщений: 633
и в один селект?
18 окт 13, 18:39    [15000202]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Jaffar
а без CTE?
А по ссылке сходить?
18 окт 13, 18:39    [15000204]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Гавриленко Сергей Алексеевич
Jaffar
а без CTE?
А по ссылке сходить?


еще более простой вариант?
18 окт 13, 18:43    [15000221]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гавриленко Сергей Алексеевич
Jaffar
а без CTE?
А по ссылке сходить?


для целых - да
a = a + b;
b = a - b;
a = a - b;

а если например nvarchar? в формулировке сказано:

Есть 2 переменные одинакового типа a и b.
Как поменять в них значения местами, 
18 окт 13, 18:43    [15000222]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Jaffar,

более того не все типы данных поддерживают операцию "плюс" и "минус".
18 окт 13, 18:44    [15000226]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Winnipuh
Гавриленко Сергей Алексеевич
пропущено...
А по ссылке сходить?


для целых - да
a = a + b;
b = a - b;
a = a - b;

а если например nvarchar? в формулировке сказано:

Есть 2 переменные одинакового типа a и b.
Как поменять в них значения местами, 
Формулировки меняются на ходу, не аргумент.
18 окт 13, 18:44    [15000227]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Jaffar
и в один селект?

В один селект неинтересно, могу в три:
select @a = (select @b), @b = (select @a)
18 окт 13, 18:47    [15000241]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
Jaffar, Гость жа почти написал...
declare @a int, @b int
select @a=1,@b=2
select @a a,@b b
select @a=@a+@b,@b=@a-@b,@a=@a-@b
select @a a,@b b
18 окт 13, 18:47    [15000246]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
P.S.: SQL SERVER – Transaction and Local Variables – Swap Variables – Update All At Once Concept
18 окт 13, 18:48    [15000255]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Гость333
Jaffar
и в один селект?

В один селект неинтересно, могу в три:
select @a = (select @b), @b = (select @a)


ну хотябы в 2
18 окт 13, 18:49    [15000257]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Jaffar
Гость333
пропущено...

В один селект неинтересно, могу в три:
select @a = (select @b), @b = (select @a)


ну хотябы в 2


select @a = (@b), @b = (select @a)


Но менять условия по ходу пьесы некрасиво как-то.
18 окт 13, 18:50    [15000263]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Jaffar
Гость333
пропущено...

В один селект неинтересно, могу в три:
select @a = (select @b), @b = (select @a)


ну хотябы в 2

На самом деле я соврал, насчёт одного селекта очень даже интересно :)
18 окт 13, 18:51    [15000266]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гавриленко Сергей Алексеевич
Winnipuh
пропущено...


для целых - да
a = a + b;
b = a - b;
a = a - b;

а если например nvarchar? в формулировке сказано:

Есть 2 переменные одинакового типа a и b.
Как поменять в них значения местами, 
Формулировки меняются на ходу, не аргумент.


что меняется? я прочитал это в вопросе ТС ;-)
18 окт 13, 18:53    [15000275]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Гавриленко Сергей Алексеевич

Но менять условия по ходу пьесы некрасиво как-то.


Почему менять - ведь не указано же было что именно тип числовой.
18 окт 13, 18:56    [15000284]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
declare @a char = 'a', @b char = 'b'

select @a, @b

select @a = max(@b), @b = max(@a)

select @a, @b
18 окт 13, 18:58    [15000294]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Jaffar
Member

Откуда:
Сообщений: 633
buser
declare @a char = 'a', @b char = 'b'

select @a, @b

select @a = max(@b), @b = max(@a)

select @a, @b



принято. :)
18 окт 13, 19:03    [15000314]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Jaffar
buser
declare @a char = 'a', @b char = 'b'

select @a, @b

select @a = max(@b), @b = max(@a)

select @a, @b



принято. :)


не

declare @a nvarchar(MAX)
declare @b nvarchar(MAX)

select @a= N'a', @b = N'b'

select @a, @b

select @a = max(@b), @b = max(@a)

select @a, @b
18 окт 13, 19:08    [15000328]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SELECT @a=b, @b=a FROM (VALUES(@a),(@b))T(a,b);
18 окт 13, 19:12    [15000346]     Ответить | Цитировать Сообщить модератору
 Re: Интересная задачка  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
SELECT @a=b, @b=a FROM (VALUES(@a),(@b))T(a,b);


ну дык:
нельзя использовать:
- третью перемнную
- любые типы таблиц(табл.), процедуры, функции и т.п.
18 окт 13, 19:13    [15000348]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить