Оператор подзапросов MySQL и PostgreSQL - PullRequest
0 голосов
/ 19 октября 2018

Я был немного смущен при чтении документации MySQL Документация MySQL

 A row subquery is a subquery variant that returns a single row and can thus return more than one column value. Legal operators for row subquery comparisons are:
  =  >  <  >=  <=  <>  !=  <=>

Для документации "=" есть хорошее объяснение:

SELECT * FROM t1 WHERE (column1,column2) = (1,1);
is same as:
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;

Но как">" или "<" могут сравнивать две строки?Что такое «простой» вариант для этого оператора?</p>

create table example(a integer,b integer);
insert into example values (1,1);
insert into example values (1,2);
insert into example values (2,1);
select * from example where (a,b) > (1,1)
a | b
-----
1 | 2
2 | 1

Детская площадка: http://www.sqlfiddle.com/#!9/88641/2

ps:

  • PostgreSQL работает аналогично.
  • Сбой Oracle с ошибкой "ORA-01796: этот оператор нельзя использовать со списками "

1 Ответ

0 голосов
/ 20 октября 2018

MySQL и PostgreSQL ведут себя одинаково, давайте прочитаем документацию postgres

Случаи = и <> работают несколько иначе, чем другие.Две строки считаются равными, если все их соответствующие члены ненулевые и равные;строки являются неравными, если любые соответствующие члены не равны нулю и не равны;в противном случае результат сравнения строк неизвестен (null).

Для случаев <, <=,> и> = элементы строки сравниваются слева направо, останавливаясь сразу после неравного илинайдена нулевая пара элементов.Если какой-либо из этой пары элементов является нулевым, результат сравнения строк неизвестен (нулевой);в противном случае сравнение этой пары элементов определяет результат.Например, ROW (1,2, NULL)

Итак (a, b) = (c, d) оценивается как a = c и b = d

Но (a, b,) <(c, d) оценивается как a <b или (a = c и b <c)</p>

Это выглядит очень странно.И я не догадываюсь, как будет оцениваться сравнение строк с 3 и более атрибутами;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...