powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как исправить PATINDEX ASE 12.5.0.3 чтобы работало ASA 8.0.3.5002
4 сообщений из 4, страница 1 из 1
Как исправить PATINDEX ASE 12.5.0.3 чтобы работало ASA 8.0.3.5002
    #34073538
Фотография Badger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, вот еще один глюк в расхождения в T-SQL по ASE 12.5.0.3 и ASA 8.0.3.5002

Для ASE обе строки вернут ноль '0', а для ASA почему-то в первый SELECT PATINDEX('%[:-я]%' возвращает 1

Код: plaintext
1.
2.
3.
select PATINDEX('%[:-я]%','1234567890')
go
select PATINDEX('%[!-/]%','1234567890')
go

я не понимаю, как сделать чтобы в обеих ASA и ASE это работало одинаково.
T-SQL сто лет назад был выверен, а глюки остались или я что то не корректно делаю?
или в следующих версиях ASA это по другому?
...
Рейтинг: 0 / 0
Как исправить PATINDEX ASE 12.5.0.3 чтобы работало ASA 8.0.3.5002
    #34073930
Фотография Badger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пришло в голову после обеда:
Код: plaintext
select PATINDEX('%[:-я]%','1234567890')

разбить на два подзапроса...

Код: plaintext
1.
select PATINDEX('%[:-@]%', '1234567890')
select PATINDEX('%[A-я]%', '1234567890')

P.S. Ошибка, прошедшая через много патчей становится фичей
...
Рейтинг: 0 / 0
Как исправить PATINDEX ASE 12.5.0.3 чтобы работало ASA 8.0.3.5002
    #34088990
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BadgerP.S. Ошибка, прошедшая через много патчей становится фичей
А это и есть не ошибка вовсе, а фича. Суть ее проста: вы пытаетесь сформировать паттерн для PATINDEX, исходя из последовательности кодов символов в charset'е, в то время как PATINDEX в ASA, также как и оператор LIKE, и так же как сортировка по ORDER BY, оперирует правилами сравнения символов, заданными параметром БД COLLATION.
ASA 8.0.3 documentation - Маленькая цитата про LIKE
A range of characters to look for is specified by giving the ends of the range inside square brackets, separated by a hyphen. <...> The range of characters [a-z] is interpreted as "greater than or equal to a, and less than or equal to z", where the greater than and less than operations are carried out within the collation of the database .
Рассмотрим collation=1251CYR - цифры здесь действительно находятся после знаков препинания и перед буквами. Поэтому для грамотного составления паттернов полезно было бы изучить используемый в БД collation, выгрузив его с помощью утилиты dbcollat.

Маленький пример, объясняющий ваш пример с PATINDEX:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select q.f1 from
(select ':' as f1
union select '@'
union select '1'
union select '9'
union select 'A'
union select 'я') q
order by  1 
дает сортированный результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
':'
'@'
'1'
'9'
'A'
'я'
...
Рейтинг: 0 / 0
Как исправить PATINDEX ASE 12.5.0.3 чтобы работало ASA 8.0.3.5002
    #34092242
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.K.Маленький пример, объясняющий ваш пример с PATINDEX:
Лучше даже так:
Код: plaintext
1.
2.
3.
select row_num as code , char(row_num) as symbol
from rowgenerator
where row_num <  255 
order by symbol
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как исправить PATINDEX ASE 12.5.0.3 чтобы работало ASA 8.0.3.5002
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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