Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужна помощь с сортировкой / 15 сообщений из 15, страница 1 из 1
09.08.2018, 22:32
    #39685781
FB2005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
Привет всем.

Есть база на UTF8, таблица с VARCHAR полем.
Есть Microsoft Windows с поддержкой английского и русского языков.
Как при сортировке строк внутри stored procedure получить точно тот же порядок, что получается при сортировке тех же строк через Windows API?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
CREATE GENERATOR IDGEN;
SET GENERATOR IDGEN TO 0;

CREATE TABLE USERS (
    ID INTEGER,
	TEXTFIELD VARCHAR(127) COLLATE UNICODE,
    CONSTRAINT PK_USERS PRIMARY KEY(ID)
);

SET TERM ^ ;

CREATE PROCEDURE GENERATE_DATA
AS
BEGIN
	INSERT INTO USERS (ID,TEXTFIELD) VALUES (GEN_ID(IDGEN, 1),'abun');
	INSERT INTO USERS (ID,TEXTFIELD) VALUES (GEN_ID(IDGEN, 1),'abu-k');	
	INSERT INTO USERS (ID,TEXTFIELD) VALUES (GEN_ID(IDGEN, 1),'abuk');	
	INSERT INTO USERS (ID,TEXTFIELD) VALUES (GEN_ID(IDGEN, 1),'abu-n');
	INSERT INTO USERS (ID,TEXTFIELD) VALUES (GEN_ID(IDGEN, 1),'abu-');
	INSERT INTO USERS (ID,TEXTFIELD) VALUES (GEN_ID(IDGEN, 1),'abum');
	INSERT INTO USERS (ID,TEXTFIELD) VALUES (GEN_ID(IDGEN, 1),'abu-m');
	INSERT INTO USERS (ID,TEXTFIELD) VALUES (GEN_ID(IDGEN, 1),'abu');
END
^

CREATE PROCEDURE TEST
RETURNS (
	TEXTFIELD VARCHAR(127))
AS
BEGIN
	FOR SELECT TEXTFIELD
	FROM USERS
	ORDER BY TEXTFIELD
	INTO :TEXTFIELD
	DO
	BEGIN
		SUSPEND;
	END
END
^



Результат сортировки SQL:
abu
abu-
abu-k
abu-m
abu-n
abuk
abum
abun

Результат сортировки Windows:
abu
abu-
abuk
abu-k
abum
abu-m
abun
abu-n
...
Рейтинг: 0 / 0
09.08.2018, 22:37
    #39685782
FB2005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
Firebird 3.0
...
Рейтинг: 0 / 0
09.08.2018, 23:09
    #39685788
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
С collation поиграйся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.08.2018, 23:21
    #39685790
FB2005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
Я понимаю, что нужен какой-то collate, но даже не представляю какой. Связи с национальными языками нет. Потому и спрашиваю у специалистов и разработчиков.
...
Рейтинг: 0 / 0
09.08.2018, 23:48
    #39685793
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
FB2005Результат сортировки WindowsКак получены ?
...
Рейтинг: 0 / 0
09.08.2018, 23:56
    #39685794
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
FB2005,

ну создать такой коллейт весьма проблематично. По крайней мере я не вижу параметров которые бы позвололяет игнорировать не буквенно-цифровые символы. Есть опция для учёта конечных пробелов, но это не то.

Вот это на твоих данных даёт правильный результат

Код: sql
1.
2.
3.
select TEXTFIELD
from USERS
order by replace(TEXTFIELD, '-', ''), char_length(TEXTFIELD)



но думаю это не совсем то что надо, там ведь вместо дефиса могут и другие символы вылезти.
...
Рейтинг: 0 / 0
10.08.2018, 00:07
    #39685795
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
hvladFB2005Результат сортировки WindowsКак получены ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
C:\Users\Vlad>sort s:\Temp\s.txt
abu-
abu-k
abu-m
abu-n
abu
abuk
abum
abun
Это - сортировка Windows ? С помощью WinAPI ?
...
Рейтинг: 0 / 0
10.08.2018, 00:27
    #39685796
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
Симонов ДенисПо крайней мере я не вижу параметров которые бы позвололяет игнорировать не
буквенно-цифровые символы.

MULTI-LEVEL не оно?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2018, 09:03
    #39685849
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
FB2005Результат сортировки Windows:
abu
abu-
abuk
abu-k
abum
abu-m
abun
abu-n
Странная сортировка. "-" идёт раньше любой буквы.
...
Рейтинг: 0 / 0
10.08.2018, 23:21
    #39686294
FB2005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
Сравнение строк в Windows происходит посредством вызова стандартной функции lstrcmp/lstrcmpi, которая в свою очередь вызывает CompareString, использующую текущую локаль потока.

В документации по Windows API есть интересное замечание о сортировке:

The lstrcmpi function uses a word sort, rather than a string sort. A word sort treats hyphens and apostrophes differently than it treats other symbols that are not alphanumeric, in order to ensure that words such as "coop" and "co-op" stay together within a sorted list. For a detailed discussion of word sorts and string sorts, see the Remarks section for the CompareString function.
https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-lstrcmpw

Там же ссылка на объяснение сортировки:
Handling Sorting in Your Applications
https://docs.microsoft.com/en-us/windows/desktop/Intl/handling-sorting-in-your-applications

Возможно ли получить такой результат в Firebird?
...
Рейтинг: 0 / 0
11.08.2018, 01:23
    #39686307
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
FB2005,

Вот тут http://demo.icu-project.org/icu-bin/collation.html можно попробовать разные опции коллейтов,
реализованные в ICU.

Похоже, требуемая сортировка достигается с alternate = non-ignorable.
Но, насколько я понимаю, этот аттрибут (alternate) не поддерживается в CREATE COLLATION
...
Рейтинг: 0 / 0
11.08.2018, 01:42
    #39686308
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
hvladПохоже, требуемая сортировка достигается с alternate = non-ignorable.shifted, конечно
...
Рейтинг: 0 / 0
11.08.2018, 13:38
    #39686380
FB2005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
hvlad,

Очень похоже, но в этом режиме не сортирует строки с апострофами.

Почитал ICU User Guide Collation FAQ

Q. How can collation rules mimic word sorting?

A. This specific behavior can be mimicked using a tailoring that makes these characters completely ignorable. In this case, appropriate rule would be "& = '' = '-'".

Please note that we don't think that such solution is correct, since different languages have different word elements. Instead one should use shifted mode for comparison.

http://userguide.icu-project.org/collation/faq

Пока не понял, куда это правило вставлять ;-)
...
Рейтинг: 0 / 0
11.08.2018, 15:01
    #39686403
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
FB2005that makes these characters completely ignorableЭто практически не отличается от 21636947

Т.е., если без такой "сортировки" не жить, то можно добавить индекс по выражению\или вычислимое поле и сортировать по нему, не извращая коллейты
...
Рейтинг: 0 / 0
11.08.2018, 15:02
    #39686405
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с сортировкой
FB2005Пока не понял, куда это правило вставлять ;-)В append rules в тут http://demo.icu-project.org/icu-bin/collation.html

Синтаксис CREATE COLLATION это не поддерживает, afaiu
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужна помощь с сортировкой / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]