Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 сортировка букв е и ё  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Может и ламерский вопрос...
Про сортировку...
Но сильно не бейте...

SELECT @@version

Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
	May 14 2014 18:34:29 
	Copyright (c) Microsoft Corporation
	Express Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)


Параметры сортировки БД: Cyrillic_General_CI_AS
И запрос:
select R.n from
(select 'алёна' as n
union
select 'алеся' as n
union
select 'алена' as n
) R
order by R.n

дает результат:
алена
алёна
алеся

Какой параметр сортировки надо указать, чтобы результат был:
алена
алеся
алёна

Что имхо правильнее...
11 ноя 15, 15:13    [18400552]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Владимир СА, есть вот такой вариант, но буква "ё" почему то идет перед "е", а не после:

select R.n from
(select 'алёна' collate Cyrillic_General_100_BIN as n
union
select 'алеся' as n
union
select 'алена' as n
) R
order by R.n
11 ноя 15, 15:21    [18400608]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Заказчик то требует:
алена
алеся
алёна


Кстати и в запросах надо
union all
11 ноя 15, 15:28    [18400651]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
ГуЗы
Guest
Владимир СА,
и еще
N'алена'
11 ноя 15, 15:41    [18400756]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Я думаю, что правила сравнения строк с COLLATE Cyrillic_General_CI_AS не сводятся к последовательному сравнению
одиночных символов, а включают в себя сравнение ещё и некоторых комбинаций символов.
Как-то мы тут всё это обсуждали. Со ссылками на статьи.
К примеру, вот такой запрос сортирует как надо:
WITH T AS(SELECT * FROM(VALUES(1,'алёна'),(2,'алеся'),(3,'алена'))T(ID,S))
SELECT * FROM T ORDER BY SUBSTRING(S,1,1) COLLATE Cyrillic_General_CI_AS,SUBSTRING(S,2,1) COLLATE Cyrillic_General_CI_AS,SUBSTRING(S,3,1) COLLATE Cyrillic_General_CI_AS;
Потому что сервер вынужден последовательно сравнивать именно одиночные символы.
11 ноя 15, 15:42    [18400766]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
ГуЗы, кстати, преобразование к nvarchar дает интересный эффект - вот скрипт:
with R as
(select 'алёнаа' as n
union
select 'алеся' as n
union
select 'аленая' as n
union 
select 'аленаа'
union 
select 'алёная'
union 
select 'алтын'
)
select R.n 
from R order by cast(R.n as varchar(max)) collate Cyrillic_General_100_BIN


В таком виде строки с "ё" будут в самом начале. Если varchar заменить на nvarchar, они переедут в самый конец (даже после "алтына", который, по идее, должен быть последним).
11 ноя 15, 15:46    [18400817]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
ГуЗы
Guest
Minamoto,
Очевидно:
select unicode(N'ё'), unicode(N'e'), ASCII('ё'), ASCII('е')

но не расписывать же по символам...
11 ноя 15, 16:43    [18401318]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
o-o
Guest
Владимир СА
Заказчик то требует:
алена
алеся
алёна

declare @t table (s varchar(100));
insert into @t values ('алёна'), ('алеся'), ('алена');

select *
from @t
order by replace(replace(s, 'е', '1'), 'ё', '2')

11 ноя 15, 16:59    [18401444]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
ГузЫ
Guest
o-o
Владимир СА
Заказчик то требует:
алена
алеся
алёна

declare @t table (s varchar(100));
insert into @t values ('алёна'), ('алеся'), ('алена');

select *
from @t
order by replace(replace(s, 'е', '1'), 'ё', '2')


!!!! Не мытьем, так катаньем!
В том смысле, что не в лоб, так по лбу!
11 ноя 15, 17:07    [18401538]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
o-o
Guest
не, ну это никакое не решение,
е, ё оно отсортирует, но они вылетят вообще в самое начало
11 ноя 15, 18:41    [18402137]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Попробовать другие COLLATE.
Авось что-нибудь подойдёт
11 ноя 15, 19:37    [18402374]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
o-o
Guest
Надо "ё" заменять на "ж1".
Тогда слово гарантированно уйдет ниже соседей с "е",
но среди всех с "ж" в той же позиции будет иметь приоритет из-за "1"
declare @t table (s varchar(100));
insert into @t values ('алжир'),  ('алёна'), ('алеся'), ('алена');

select *
from @t
order by replace(s, 'ё', 'ж1')
11 ноя 15, 19:55    [18402424]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
guest45
Guest
collate, скорее всего, соответствует стандарту unicode.org

http://unicode.org/reports/tr10/
http://unicode.org/charts/collation/
11 ноя 15, 20:43    [18402652]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
guest45
Guest
согласно https://ru.wikipedia.org/wiki/Ё_(кириллица)#.D0.A1.D0.BE.D1.80.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0
со ссылкой на http://gramota.ru/class/istiny/istiny_7_jo/
е (ye) и ё (yo) равны

собственно, о том же
http://unicode.org/mail-arch/unicode-ml/y2012-m12/0117.html
http://bugs.mysql.com/bug.php?id=7072
11 ноя 15, 21:33    [18402863]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
Пишем волшебную функцию:
create function dbo.fnYeYo
(
 @s varchar(max)
)
returns varchar(max)
as
begin
 declare @r varchar(max) = '', @p int = 1;

 while @p <= len(@s)
  begin
   select @r += case substring(@s, @p, 1) collate Cyrillic_General_BIN when 'ё' then 'ё1' when 'Ё' then 'Ё1' else substring(@s, @p, 1) + ' ' end;
   select @p += 1;
  end;
 
 return @r;  
end;
go

Сортируем:
declare @t table (s varchar(100));
insert into @t values ('алжир'),  ('алёна'), ('алеся'), ('алена');

select
 * 
from
 @t t cross apply
 (select dbo.fnYeYo(t.s)) a(x)
order by
 a.x;
11 ноя 15, 22:35    [18403105]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
Алфавит
Guest
Владимир СА
Может и ламерский вопрос...
Про сортировку...
...
[/src]
дает результат:
алена
алёна
алеся

Какой параметр сортировки надо указать, чтобы результат был:
алена
алеся
алёна

Что имхо правильнее...


Сортирует то не только по букве Е/Ё, но еще и по следующим символам. Буква С (алеся) идет после буквы Н (алёна), так что сортировка вполне правильная - строго порядку следования букв в алфавите
12 ноя 15, 05:29    [18403812]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Алфавит
...
Сортирует то не только по букве Е/Ё, но еще и по следующим символам. Буква С (алеся) идет после буквы Н (алёна), так что сортировка вполне правильная - строго порядку следования букв в алфавите
Чисто согласен, что сортируется вся последовательность символов... Что как раз и нужно...
Т.е. если (отвлеченно) сортировать набор:
алёна
алеся
алена
то он должен быть отсортирован в виде...
алена
алеся
алёна
И это по моему мнению и по мнению заказчика правильная сортировка... А по вашему ?

iap
Я думаю, что правила сравнения строк с COLLATE Cyrillic_General_CI_AS не сводятся к последовательному сравнению
одиночных символов, а включают в себя сравнение ещё и некоторых комбинаций символов.
Как-то мы тут всё это обсуждали. Со ссылками на статьи.
К примеру, вот такой запрос сортирует как надо:
WITH T AS(SELECT * FROM(VALUES(1,'алёна'),(2,'алеся'),(3,'алена'))T(ID,S))
SELECT * FROM T ORDER BY SUBSTRING(S,1,1) COLLATE Cyrillic_General_CI_AS,SUBSTRING(S,2,1) COLLATE Cyrillic_General_CI_AS,SUBSTRING(S,3,1) COLLATE Cyrillic_General_CI_AS;
Потому что сервер вынужден последовательно сравнивать именно одиночные символы.
Хмм...
У меня результат:
IDS
2алеся
3алена
1алёна
вторая строка должна поменяться с первой...

invm
Пишем волшебную функцию...
Дык завтра появятся другие примеры, чтобы сортировка была правильной...
Просто SQL должен производить правильную сортировку... Или я что-то неправильно говорю ?

Посмотрим на Oracle
NLS_CHARACTERSET = CL8MSWIN1251
Запрос:
select * from
(select 'алёна' as n from dual
union all
select 'алена' as n from dual
union all
select 'алеся' as n from dual
)
order by n;

дает правильный результат:
алена
алеся
алёна
Почему у SQL этого не видно...?

iap
Попробовать другие COLLATE.
Авось что-нибудь подойдёт
С этим чисто соглашусь... Я думал у кого-то эта проблема встречалась и он знает решение...
12 ноя 15, 07:08    [18403853]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
o-o
Guest
Владимир СА,

Вы очень странные выводы сделали из того, что вам тут понаписали.
Приведены ссылки, где официально признано равенство е и ё, из чего можно догадаться, что бессмысленно другие лингвистические коллэйшены пробовать.
Или вы вообще некириллические имеете в виду?
С бинарными тоже ясно, достаточно на ascii('ё') взглянуть.
Вам предложили 2 работающих варианта, к ним не контрпримеры надо подбирать, а понять суть.
Принцип там один и тот же.
Тогда и не возникнут мысли типа "завтра появятся другие примеры".
Оракл.. Ну да, впереди планеты всей.
Расскажите о нем клиенту, пусть на него и мигрирует.
Соседская трава всегда зеленее
12 ноя 15, 08:00    [18403901]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
o-o
Владимир СА,

Вы очень странные выводы сделали из того, что вам тут понаписали.
Приведены ссылки, где официально признано равенство е и ё, из чего можно догадаться, что бессмысленно другие лингвистические коллэйшены пробовать.
Или вы вообще некириллические имеете в виду?
С бинарными тоже ясно, достаточно на ascii('ё') взглянуть.
Вам предложили 2 работающих варианта, к ним не контрпримеры надо подбирать, а понять суть.
Принцип там один и тот же.
Тогда и не возникнут мысли типа "завтра появятся другие примеры".
Оракл.. Ну да, впереди планеты всей.
Расскажите о нем клиенту, пусть на него и мигрирует.
Соседская трава всегда зеленее
Вы неправильно все поняли...
Может неудачно выразился...
И так функция от invm - удачная... (большое спасибо)
Но каждый раз подцеплять ее в запросы, для того чтобы правильно сортировалось текстовое поле... это не есть ГУД...
Я об этом...
o-o
Оракл.. Ну да, впереди планеты всей.
Расскажите о нем клиенту, пусть на него и мигрирует.
Соседская трава всегда зеленее
Мне как раз неинтересно заказчику об этом сообщать...
Мне непонятно, почему MSSQL сразу не сделает что-то аналогичное...
А заказчику не объяснишь (особенно московским), что MSSQL при сортировке воспринимает буквы "е" и "ё" одинаковыми...
select R.n from
(
select 'алёна' as n
union all
select 'алеся' as n
union all
select 'алена' as n
union all
select 'алёва' as n
union all
select 'алега' as n
) R
order by R.n

алёва
алега
алена
алёна
алеся

При использовании функции от invm - все ОК...
sx
алегаа л е г а
аленаа л е н а
алеся а л е с я
алёваа л ё1в а
алёнаа л ё1н а
алжира л ж и р

Но когда будут использоваться большие данные... для того чтобы функция отработала есть большая вероятность, что начнутся тормоза...
12 ноя 15, 09:37    [18404208]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир СА
Мне непонятно, почему MSSQL сразу не сделает что-то аналогичное...

MSSQL использует коллейты, т.е. уже заранее определенные правила сортировки.
Так же как и Оракл.
12 ноя 15, 09:50    [18404265]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Glory
Владимир СА
Мне непонятно, почему MSSQL сразу не сделает что-то аналогичное...

MSSQL использует коллейты, т.е. уже заранее определенные правила сортировки.
Так же как и Оракл.
А подкорректировать правила...
И давайте уже не будем про оракл...
Я смотрю, его здесь воспринимают как красная тряпка для быка...
Имхо, всегда надо принимать хорошее у других...
12 ноя 15, 09:55    [18404288]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир СА
А подкорректировать правила...

Корректировать чужие правила ? Каким образом ?

Владимир СА
Имхо, всегда надо принимать хорошее у других...

Для этого есть обратная связь с пользователемм.
Напишите туда что лучшее нужно перенять
12 ноя 15, 09:58    [18404307]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Посмотрите тему

глюк при сравнении строк

и сходите по ссылкам, которые там давали
12 ноя 15, 10:04    [18404341]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
o-o
Guest
Наверное, потому не сделали, что никто не протестовал, когда е и ё объявляли одним и тем же.
У вас на клавиатуре телефона, например, вообще есть это самое ё?
У меня нет, и обхожусь прекрасно без.
А уж наверное было б это ё супер востребованным, хотя бы для телефона постарались.
Заказчику передайте "вам шашечки или ехать".
Кстати, ф-ция ничего не тормозит и план с replace такой же, ordered scan пролетит, если мог бы быть, ну так это как раз про шашечки.
Клиенту объяснить, что за сорт надо платить.
Накрайняк, сделать вычисляемое поле persisted и на него индекс

К сообщению приложен файл. Размер - 130Kb
12 ноя 15, 10:29    [18404505]     Ответить | Цитировать Сообщить модератору
 Re: сортировка букв е и ё  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
o-o
У вас на клавиатуре телефона, например, вообще есть это самое ё?
У меня нет, и обхожусь прекрасно без.
У меня тоже, но долгое нажатие на "е" приводит-таки к появлению "ё".
Я сам догадался!
12 ноя 15, 10:32    [18404524]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить