SQLIte MAX против Postgresql GREATEST, со строками - PullRequest
0 голосов
/ 08 сентября 2018

Согласно некоторым другим сообщениям, функция SQLite max () эквивалентна функции Postgresql GREATEST (). Может кто-нибудь объяснить странное поведение функции SQlite max со строками:

    select max ('rb','VISA', 'Visa', 'Visa Card1', 'VISA VISA Card', 'Visaaa')

возвращает 'rb'. Зачем?!? Я ожидаю, что «VISA VISA Card» как самая длинная строка будет возвращена в результате ...

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Во-первых, длина строки не имеет значения. Он смотрит на самое высокое значение в соответствии с порядком сортировки.

Во-вторых, последовательность сортировки по умолчанию - BINARY, поэтому она смотрит на значения ASCII.

В-третьих, не имеет значения, что вы используете MAX() в качестве агрегирующей или скалярной функции, однако ее использование дает тот же результат.

Наконец, неверно также и то, что PostgreSQL выдает самую длинную строку при использовании GREATEST () ...

  • У него просто другая последовательность сортировки (в каком порядке оцениваются символы): http://sqlfiddle.com/#!15/6fbe6/4
0 голосов
/ 08 сентября 2018

Возвращает самое высокое значение в соответствии с представлением символа в байтах (более высокие значения в нижнем регистре, чем в верхнем регистре).

Измените на select max ('rb','vISA', 'Visa', 'Visa Card1', 'VISA VISA Card', 'Visaaa') и получите vISA .

Комментарий

И есть ли способ извлечь самую длинную строку?

Если вам нужна самая длинная строка и предполагается, что данные находятся в столбце (в данном случае с именем mystring ) таблицы (в данном случае с именем test ), вы можете использовать: -

SELECT mystring FROM test ORDER BY length(mystring) DESC LIMIT 1;

, например

DROP TABLE IF EXISTS test;
CREATE TABLE IF NOT EXISTS test (mystring TEXT);
INSERT INTO test VALUES ('rb'),('VISA'),('Visa Card1'),('VISA VISA Card'),('Visaaa');
SELECT mystring FROM test ORDER BY length(mystring) DESC LIMIT 1;

Результаты: -

enter image description here

  • Обратите внимание, что результат будет произвольным (из самой длинной строки), если будет несколько строк одинаковой самой длинной длины.
...