Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 оператор XOR  [new]
Гасанов Эльнур
Member

Откуда:
Сообщений: 6
Добрый день. Хочу в условии использовать оператор XOR, ругается "Incorrect syntax near 'XOR'." Меняю его на AND или OR - все работает. Может здесь что-то с версией не-то?
4 мар 19, 08:32    [21824027]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Гасанов Эльнур
Хочу в условии использовать оператор XOR, ругается "Incorrect syntax near 'XOR'." Меняю его на AND или OR - все работает
Нет такого. А AND и OR есть

XOR в сиквеле пишется как |
4 мар 19, 08:54    [21824035]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2730
^
4 мар 19, 08:57    [21824036]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
Гасанов Эльнур
Member

Откуда:
Сообщений: 6
К сожалению и | и ^ не работает.
4 мар 19, 09:01    [21824038]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Гасанов Эльнур
К сожалению и | и ^ не работает.
Репро?

select 6 | 1
------------
7
4 мар 19, 09:08    [21824042]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
alexeyvg
XOR в сиквеле пишется как |
Да, перепутал с OR
Конечно, ^

select 6 | 3, 6 ^ 3
(No column name)	(No column name)
7	                        5
4 мар 19, 09:15    [21824047]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
aleks222
Member

Откуда:
Сообщений: 949
alexeyvg
alexeyvg
XOR в сиквеле пишется как |
Да, перепутал с OR
Конечно, ^

select 6 | 3, 6 ^ 3
(No column name)	(No column name)
7	                        5


Вангую, страдалец жаждет XOR в where.

Он плохо учил булеву алгебру в школе.
4 мар 19, 09:27    [21824055]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
Гасанов Эльнур
Member

Откуда:
Сообщений: 6
Да так работает. В WHERE не работает((((((((((((((((
4 мар 19, 09:33    [21824056]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
aleks222
Member

Откуда:
Сообщений: 949
Гасанов Эльнур
Да так работает. В WHERE не работает((((((((((((((((

логический XOR выражопывается через OR и AND.

Лехко

A xor B

эквивалентно

( A or B ) and not ( A and B )
4 мар 19, 09:40    [21824060]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
Гасанов Эльнур
Member

Откуда:
Сообщений: 6
aleks222, Спасибо!
4 мар 19, 09:52    [21824068]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Гасанов Эльнур
Да так работает. В WHERE не работает((((((((((((((((
Как вы пишете условие в WHERE с оператором ^ ?
Как не работает-то?
4 мар 19, 11:50    [21824165]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Гасанов Эльнур,

в выражении A^B каждый бит в A сравнивается с соответствующим битом в B,
и если биты равны, в результате этот бит будет равен 0, а если биты разные, то в результате он будет равен 1.
Этот результат не имеет тип BOOLEAN, который нужен в WHERE. Сравнить ещё надо с чем-то.
4 мар 19, 11:54    [21824171]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
iap
в выражении A^B каждый бит в A сравнивается с соответствующим битом в B,
и если биты равны, в результате этот бит будет равен 0, а если биты разные, то в результате он будет равен 1.
Этот результат не имеет тип BOOLEAN, который нужен в WHERE.
Да, но ТС, оказывается, нужен логический XOR
То есть TRUE XOR TRUE = FALSE, FALSE XOR FALSE = FALSE, TRUE XOR FALSE или FALSE XOR TRUE = TRUE

Такого действительно в сиквеле нет, нужно имитировать ( A or B ) and not ( A and B )
4 мар 19, 15:12    [21824497]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7746
Гасанов Эльнур,

какое действие над множествами должно произвести "исключающее или"? Здесь все-таки реляционная алгебра.
4 мар 19, 15:45    [21824559]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
alexeyvg
Такого действительно в сиквеле нет, нужно имитировать ( A or B ) and not ( A and B )

если A и B достаточно громоздкие и точно не unknown, то можно использовать iif(A, 1, 0) <> iif(B, 1, 0)
4 мар 19, 16:29    [21824609]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Shakill
если A и B достаточно громоздкие
Громоздкость можно убрать подзапросами. А iif появился в самых последних версиях, не всем он доступен, + ограничение на NULL.
4 мар 19, 19:03    [21824769]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4712
Гасанов Эльнур,
А XOR был нужен булевый или битовый?


SELECT A, B, (A | B) & ~ (A & B) AS XOR FROM 
(
	SELECT 0 AS A, 0 AS B UNION ALL 
	SELECT 15, 0 UNION ALL 
	SELECT 15, 15 UNION ALL 
	SELECT 7, 8 
) A


A B XOR
0 0 0
15 0 15
15 15 0
7 8 15
4 мар 19, 20:04    [21824803]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
alexeyvg
Shakill
если A и B достаточно громоздкие
Громоздкость можно убрать подзапросами. А iif появился в самых последних версиях, не всем он доступен, + ограничение на NULL.
+ нафиг он нужен, если есть стандартный CASE!
4 мар 19, 20:42    [21824821]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
alexeyvg
Shakill
если A и B достаточно громоздкие
Громоздкость можно убрать подзапросами. А iif появился в самых последних версиях, не всем он доступен, + ограничение на NULL.

в данном случае A и B - логические выражения; если их убирать в подзапросы и потом использовать, то сначала все равно придется приводить к bit с помощью тех же iif/case.

насчёт iif - просто потому что короче чем case, да и 2012 сервер уже не относится к самым последним версиям, кмк. хотя, конечно, авторы могли бы докрутить до конца и второй результат в iif сделать необязательным, по умолчанию чтоб как у case выдавался null
5 мар 19, 12:27    [21825231]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7746
Вчера понял, что был не прав. Реализацией XOR для запроса является выражение EXCEPT.
6 мар 19, 12:35    [21826129]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
msLex
Member

Откуда:
Сообщений: 8066
Владислав Колосов
Вчера понял, что был не прав. Реализацией XOR для запроса является выражение EXCEPT.
6 мар 19, 13:31    [21826223]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
msLex
Member

Откуда:
Сообщений: 8066
msLex
Владислав Колосов
Вчера понял, что был не прав. Реализацией XOR для запроса является выражение EXCEPT.


Отправилось раньше времени :(


EXCEPT - это "полуXOR"

для полноценного XOR нужны два EXCEPT через union all
6 мар 19, 13:33    [21826230]     Ответить | Цитировать Сообщить модератору
 Re: оператор XOR  [new]
Владислав Колосов
Member

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

да, с "переворотом". Но сам принцип.
6 мар 19, 14:05    [21826293]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить