Определение порядка для сравнений в подзапросах SQL ROW?

Мне было интересно, когда подзапрос строки выполняется с оператором сравнения, таким как > или же >=, порядок сравнения определяется с помощью лексикографического (то есть словарного) порядка или он определяется поэлементно?

То есть для ROW (A, B), должен

(79, 48) > (75, 52) 

быть TRUE (словарь) или FALSE (поэлементно) в запросе строки в WHERE статья?

Я проверил это в PostgreSQL, и кажется, что он использует порядок словаря, т.е. (79, 48) > (75, 52) является TRUE так как 79 > 75 и поэтому второй компонент не имеет значения. При поиске, кажется, что это также относится к проблеме сравнения подзапросов MySQL: MySQL, и документация MySQL, похоже, сбивает с толку в этом вопросе. В поисках postgresql row subquery не показывает много о порядке сравнения.

Хотя порядок словаря имеет смысл с точки зрения компьютерных наук, для пользователя базы данных он может показаться немного странным, поскольку теперь порядок строк зависит от того, какой столбец вы перечислите первым в SQL. Например, используя порядок словаря, мы должны иметь:

 (52, 75) > (48, 79)  

за ROW (B,A), Те же строки сравниваются, порядок точно противоположный, потому что столбец B указан первым

Мой вопрос:

Является ли это поведение (использование порядка словаря в запросах строк) стандартом SQL / кросс-вендором или оно зависит от конкретной реализации? Есть ссылки на это?

1 ответ

Решение

Это описано в главе Сравнение конструкторов строк руководства Postgres:

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

А также:

Примечание: до PostgreSQL 8.2, <, <=, > а также >= случаи не были обработаны согласно спецификации SQL. Сравнение как ROW(a,b) < ROW(c,d) был реализован как a < c AND b < d в то время как правильное поведение эквивалентно a < c OR (a = c AND b < d),

Что поясняет, что поведение современного Postgres соответствует стандарту SQL.

Это в основном та же логика, что и в ORDER BY пункт о SELECT запрос: элементы сравниваются слева направо до тех пор, пока не будет найдено первое неравенство - за исключением значений NULL, которые сортируются последними в порядке возрастания по умолчанию.

Связанные с:

Другие вопросы по тегам