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

Откуда:
Сообщений: 142
Привет всем!
Помогите, пожалуйста, с запросом. Есть табличка:

DECLARE @TAB TABLE ([ID] [int] IDENTITY(1,1) NOT NULL, [col1] [nchar](10) NULL, [col2] [nchar](10) NULL, [col3] [nchar](10) NULL)
insert into @TAB values         
('A', 'BA', 'C'),
('C', 'BA', 'A'),
('A1', 'BA', 'C1'),
('C1', 'BA', 'A1'),
('C', 'BC', 'Z'),
('C1', 'BC', 'Z1')

SELECT * FROM @TAB
WHERE ???

Получиться должно следующее:
col1 col2 col3
A BA C
A1 BA C1
C BC Z
C1 BC Z1


Объяснение проблемы: в таблице есть строки, допустим,
A BA C
C BA A

Строка C, BA, A, это "зеркальное" отображение строки A, BA, C.
Необходимо отфильтровать строки
A BA C
A1 BA C1

итд по условию, что в col2 содержится часть величины из col1, в конкретном случае "А".
12 окт 13, 15:37    [14960689]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
aleks2
Guest
DECLARE @TAB TABLE ([ID] [int] IDENTITY(1,1) NOT NULL, [col1] [nchar](10) NULL, [col2] [nchar](10) NULL, [col3] [nchar](10) NULL)
insert into @TAB values         
('A', 'BA', 'C'),
('C', 'BA', 'A'),
('A1', 'BA', 'C1'),
('C1', 'BA', 'A1'),
('C', 'BC', 'Z'),
('C1', 'BC', 'Z1')

select col1, col2, col3 from
(
select   case when col1<=col3 then col1 else col3 end col1
       , col2
       , case when col1<=col3 then col3 else col1 end col3 
       from @TAB
) x
group by col1, col2, col3


Надеюсь общая идея ясна?
Вместо case могете построить ЛЮБУЮ функцию эквивалентности.
12 окт 13, 16:42    [14960793]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
Alex2, спасибо! Идея понятна, сейчас подпиливаю под конкретное решение. Хочу уточнить суть сравнения col1<=col2 - здесь сравниваются целочисельные коды возвращаемых символов в Юникоде? Получается текстовые значения таким способом не прокатят? Хотя, сейчас попробую!
15 окт 13, 16:55    [14974514]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
И с харом работает тоже, вроде бы.
15 окт 13, 17:02    [14974570]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
Glory
Member

Откуда:
Сообщений: 104760
andrej2005
Хочу уточнить суть сравнения col1<=col2 - здесь сравниваются целочисельные коды возвращаемых символов в Юникоде?

Нет. Откуда такие фантазии ?

andrej2005
Получается текстовые значения таким способом не прокатят?

Символьные данные сравниваются как символьные данные. И юникодовские и неюникодовские
15 окт 13, 17:03    [14974587]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
а вот с техт не работает ...
15 окт 13, 17:06    [14974608]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
Glory
Member

Откуда:
Сообщений: 104760
andrej2005
а вот с техт не работает ...

С text много чего не работает
15 окт 13, 17:08    [14974636]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
Glory
Символьные данные сравниваются как символьные данные. И юникодовские и неюникодовские


Ну а как тогда А1 может быть меньше или равно С1? Ну равно еще ладно, понимаю, а вот как сравнивается по условию меньше - не пойму!
15 окт 13, 17:10    [14974649]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
Glory
Member

Откуда:
Сообщений: 104760
andrej2005
Ну а как тогда А1 может быть меньше или равно С1?

Потому что символ А в кодовой таблице символов стоит левее буквы С.
Если первые символы совпадают, то также будут сравниваться 2ые символы, потом 3ии и тд, пока в какой то из строк не закончатся символы

Сообщение было отредактировано: 15 окт 13, 17:13
15 окт 13, 17:12    [14974674]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
так ведь я и спрашиваю, если сравниваются целочисельные коды... спасибо, понял!
15 окт 13, 17:17    [14974713]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
Glory
Member

Откуда:
Сообщений: 104760
andrej2005
так ведь я и спрашиваю, если сравниваются целочисельные коды

Как у вас все просто. Вы например в курсе, что сравнение может быть с учетом регистра и без учета ?
15 окт 13, 17:19    [14974736]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
дык регистр забит в коде тоже, верхний регистр имеет другой код нежели маленький
15 окт 13, 17:29    [14974808]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
А как сравнить в инструкции case с учетом регистра?
15 окт 13, 17:30    [14974816]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
Glory
Member

Откуда:
Сообщений: 104760
andrej2005
А как сравнить в инструкции case с учетом регистра?

А вам зачем ?
15 окт 13, 17:31    [14974828]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
Glory
andrej2005
А как сравнить в инструкции case с учетом регистра?

А вам зачем ?


В col2 у меня настроена case sensiteve, может понадобиться, возможно. Это сложно сделать? Ссылку может какую-нибудь скинете, для информации?
15 окт 13, 17:37    [14974865]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
collate
Guest
сравнение латинских буковок и кириллицы в латинском и кириллическом коллейтах разные


select 'z > я Latin1_General_BIN '
where 'z' > 'я'  collate Latin1_General_100_ci_as

select 'z < я Cyrillic_General_100_ci_as'
where 'z' < 'я'  collate Cyrillic_General_100_ci_as
15 окт 13, 17:40    [14974881]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
наверно можно все сбросить в верхний регистр функцией UPPER в крайнем случае?
15 окт 13, 17:41    [14974884]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
collate
сравнение латинских буковок и кириллицы в латинском и кириллическом коллейтах разные


не, у меня только латинка
15 окт 13, 17:45    [14974909]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
andrej2005
так ведь я и спрашиваю, если сравниваются целочисельные коды... спасибо, понял!
Нет, сравниваются не целочисленные коды.
Например, две буквы могут идти в разном порядке, в зависимости от того, какие буквы стоят после них. Это всё описано в соответствующих языковых стандартах.
andrej2005
не, у меня только латинка
Языка "латинка" не былает (или у вас медицинская база на латыни? :-) ).
Буквы при сравнениях имеют разный вес в разных языках. Допустим, в тектсе на немецком одна буква старше другой, а на итальянском будет наоборот.
15 окт 13, 18:05    [14975017]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
alexeyvg
Языка "латинка" не былает (или у вас медицинская база на латыни? :-) ).
Буквы при сравнениях имеют разный вес в разных языках. Допустим, в тектсе на немецком одна буква старше другой, а на итальянском будет наоборот.


:) Я хотел сказать, у меня в табличках только один коллейшн - чешский, если точней.
15 окт 13, 18:26    [14975104]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
andrej2005
Member

Откуда:
Сообщений: 142
alexeyvg
Например, две буквы могут идти в разном порядке, в зависимости от того, какие буквы стоят после них. Это всё описано в соответствующих языковых стандартах.


Здесь я не понял о чем речь. Две буквы могут идти в разном порядке при сравнении на сервере или в таблице символов?
15 окт 13, 18:32    [14975127]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
andrej2005
alexeyvg
Языка "латинка" не былает (или у вас медицинская база на латыни? :-) ).
Буквы при сравнениях имеют разный вес в разных языках. Допустим, в тектсе на немецком одна буква старше другой, а на итальянском будет наоборот.


:) Я хотел сказать, у меня в табличках только один коллейшн - чешский, если точней.
А, ну тогда для сравнения "с учетом регистра" нужно в условии указать чешский регистрозависимый коллейшен.

Посмотрите, какой у вас для базы/полей коллейшен, и замените в конце CI на CS
15 окт 13, 18:34    [14975133]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
o-o
Guest
alexeyvg
Буквы при сравнениях имеют разный вес в разных языках. Допустим, в тектсе на немецком одна буква старше другой, а на итальянском будет наоборот.


не надо на италов катить
итальянский алфавит не угажен никакими буквами с точками типа "ё",
и буквы с диакритикой с немецкими не пересекаются.
они вообще в алфавит не входят, т.к. это никакие не "спец. буквы"
просто ударение иногда ставится, чтоб указать, куда оно падает.
(в русском некоторым тоже не помешало бы указывать ударение в нужном месте,
во избежание перлов типа "мЫшление" и "красивЕе")

коллейшн юзается стандартнейший Latin1_General_CI_AS.
вот на немцев правильно кАтите, плюсую
15 окт 13, 18:37    [14975153]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
andrej2005
Здесь я не понял о чем речь. Две буквы могут идти в разном порядке при сравнении на сервере или в таблице символов?
При сравнении. Что такое "идти в таблице" - это уже я не понимаю :-)

Например, такой случай разбирается здесь: https://www.sql.ru/forum/1036763-a/gluk-pri-sravnenii-strok

Символ "-" идёт перед символом "0", но символ "-" идёт после символа "0", если в строке после них следует символ "1" :-)
И это не бага, это правила сортировки, придуманные филологами!
15 окт 13, 18:44    [14975183]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с уловием запроса!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
o-o
не надо на италов катить
Ну вот, даже в русском такое есть, см. выше :-)
15 окт 13, 18:45    [14975194]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить