Определение порядка для сравнений в подзапросах 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, которые сортируются последними в порядке возрастания по умолчанию.
Связанные с: