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

Откуда: Армения, Ереван
Сообщений: 101
имеется Table1 c 1 столбцом Col1
col1
---
abc
d14
p25
qsd
f458
45d
fff
ggg

В строковой переменной задается порядок сортировки

d14,45d,f458,abc,p25

как можно результат Select * from table1 отсортировать согласно порядку в строковой переменной?
11 сен 15, 10:44    [18136424]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Glory
Member

Откуда:
Сообщений: 104760
AVRob
отсортировать согласно порядку в строковой переменной

- Превращаете строковую пременную в вспомогательную таблицу с номерами
- связываете основную таблицу сос вспомогательной
- сортируете
11 сен 15, 10:52    [18136483]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Добрый Э - Эх
Guest
AVRob,

order by PATINDEX (col1, <строковая переменныя с порядком сортировки> )
11 сен 15, 11:00    [18136545]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
AVRob
Member

Откуда: Армения, Ереван
Сообщений: 101
Glory,
А как из строки сделать таблицу с номерами?
11 сен 15, 11:08    [18136581]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
Добрый Э - Эх
AVRob,



Хотя бы вот так, а то можно нарваться
order by PATINDEX (','+col1+',', ','+<строковая переменныя с порядком сортировки>+',' )
11 сен 15, 11:08    [18136583]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Добрый Э - Эх
AVRob,

order by PATINDEX (col1, <строковая переменныя с порядком сортировки> )

не учитывает ситуацию, если есть подобне значения: 'abc', 'abcd', 'abcde'
11 сен 15, 11:09    [18136585]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Yuri Abele
Добрый Э - Эх
AVRob,

order by PATINDEX (col1, <строковая переменныя с порядком сортировки> )

не учитывает ситуацию, если есть подобне значения: 'abc', 'abcd', 'abcde'

a_voronin был быстрее :-)
11 сен 15, 11:09    [18136588]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
AVRob
Glory,
А как из строки сделать таблицу с номерами?

Например так:
DECLARE @array NVARCHAR(MAX) = 'd14,45d,f458,abc,p25';
DECLARE @xml_text NVARCHAR(MAX) = N'<I>' + REPLACE(@array, ',', N'</I><I>') + N'</I>';
DECLARE @xml XML = CAST(@xml_text AS XML);

SELECT
	item_value = item.value('.', 'NVARCHAR(MAX)'),
	item_index = ROW_NUMBER() OVER(ORDER BY (SELECT 1 AS A))
FROM
	@xml.nodes('/I') XMLDATA(item);
11 сен 15, 11:10    [18136591]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Добрый Э - Эх,

не хватает исползования разделителей.
ORDER BY CHARINDEX(','+col1+',',','+@OrderBy+',')
11 сен 15, 11:11    [18136596]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
AVRob
Member

Откуда: Армения, Ереван
Сообщений: 101
Добрый Э - Эх, patindex у меня возвращает только 0.

Вместо Patindex я попробовал Charindex.

Работает нормально, однако, когда длина строковой переменной превышает 4000 то и Charindex возвращает 0 для данных за 4000-ым символом.
11 сен 15, 11:13    [18136612]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Yuri Abele
AVRob
Glory,
А как из строки сделать таблицу с номерами?

Например так:
...

Это упрощенный вариант вот этого: MSSQL - Convert list to table #2 (array of string items)
11 сен 15, 11:14    [18136620]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
AVRob,

тогда 18136483
11 сен 15, 11:14    [18136622]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
AVRob
Добрый Э - Эх, patindex у меня возвращает только 0.

Вместо Patindex я попробовал Charindex.

Работает нормально, однако, когда длина строковой переменной превышает 4000 то и Charindex возвращает 0 для данных за 4000-ым символом.

Какого типа у вас строковая переменная? Предположу, что НЕ VARCHAR(MAX)
11 сен 15, 11:16    [18136634]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
AVRob
когда длина строковой переменной превышает 4000 то и Charindex возвращает 0 для данных за 4000-ым символом
Какого типа поле?
А если ему сделать CAST(col, NVARCHAR(MAX)) ?
11 сен 15, 11:17    [18136644]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Yuri Abele
AVRob
Добрый Э - Эх, patindex у меня возвращает только 0.

Вместо Patindex я попробовал Charindex.

Работает нормально, однако, когда длина строковой переменной превышает 4000 то и Charindex возвращает 0 для данных за 4000-ым символом.

Какого типа у вас строковая переменная? Предположу, что НЕ VARCHAR(MAX)
У него, небось, юникод (раз говорит про 4000)
11 сен 15, 11:18    [18136650]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
Yuri Abele,

да все проще.

expressionToFind
Is a character expression that contains the sequence to be found. expressionToFind is limited to 8000 characters.

У старинных функций многие параметры имеют такое ограничение.

https://msdn.microsoft.com/en-us/library/ms186323.aspx
11 сен 15, 11:18    [18136653]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
a_voronin
Yuri Abele,

да все проще.

expressionToFind
Is a character expression that contains the sequence to be found. expressionToFind is limited to 8000 characters.

У старинных функций многие параметры имеют такое ограничение.

https://msdn.microsoft.com/en-us/library/ms186323.aspx

Беееееееееее...........
Тогда лучше PATINDEX - у него нет такого ограничения
11 сен 15, 11:21    [18136681]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Yuri Abele
a_voronin
Yuri Abele,

да все проще.

expressionToFind
Is a character expression that contains the sequence to be found. expressionToFind is limited to 8000 characters.

У старинных функций многие параметры имеют такое ограничение.

https://msdn.microsoft.com/en-us/library/ms186323.aspx

Беееееееееее...........
Тогда лучше PATINDEX - у него нет такого ограничения
У него есть это ограничение!

https://msdn.microsoft.com/ru-ru/library/ms188395(v=sql.120).aspx
11 сен 15, 11:22    [18136691]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
AVRob
Member

Откуда: Армения, Ереван
Сообщений: 101
a_voronin
Yuri Abele,

expressionToFind
Is a character expression that contains the sequence to be found. expressionToFind is limited to 8000 characters.



нас интересует expressionToSearch.

Charindex возвращает 0 когда длина expressionToSearch Ю 4000 и искомая строка находится за 4000-ым символом.

Длина expressionToFind у нас не превышает 10.
11 сен 15, 11:24    [18136709]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
iap
Yuri Abele
пропущено...

Беееееееееее...........
Тогда лучше PATINDEX - у него нет такого ограничения
У него есть это ограничение!

https://msdn.microsoft.com/ru-ru/library/ms188395(v=sql.120).aspx

Читаем внимательнее - ограничение только у параметра ЧТО ищем. Ограничения на ГДЕ ищем нет
11 сен 15, 11:24    [18136710]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Функция, которая делит строку на слова
11 сен 15, 11:24    [18136717]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
AVRob
a_voronin
Yuri Abele,

expressionToFind
Is a character expression that contains the sequence to be found. expressionToFind is limited to 8000 characters.



нас интересует expressionToSearch.

Charindex возвращает 0 когда длина expressionToSearch Ю 4000 и искомая строка находится за 4000-ым символом.

Длина expressionToFind у нас не превышает 10.

Вау! Строковый массив с элементами длиннее, чем 4000 символов?!?! Это что за задача такая?
В таком случае то, что Glory вначале посоветовал - с преобразованием строки в таблицу. КАК - я пример скрипта привел
11 сен 15, 11:26    [18136726]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Yuri Abele
iap
пропущено...
У него есть это ограничение!

https://msdn.microsoft.com/ru-ru/library/ms188395(v=sql.120).aspx

Читаем внимательнее - ограничение только у параметра ЧТО ищем. Ограничения на ГДЕ ищем нет
Покажите, как пишете CHARINDEX
11 сен 15, 11:27    [18136738]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Yuri Abele
AVRob
пропущено...


нас интересует expressionToSearch.

Charindex возвращает 0 когда длина expressionToSearch Ю 4000 и искомая строка находится за 4000-ым символом.

Длина expressionToFind у нас не превышает 10.

Вау! Строковый массив с элементами длиннее, чем 4000 символов?!?! Это что за задача такая?
В таком случае то, что Glory вначале посоветовал - с преобразованием строки в таблицу. КАК - я пример скрипта привел

Если нужно отбрасывать пустые элементы и просчитывать RANKing повторяющихся элементов - идем по приведенной мною ссылке
11 сен 15, 11:28    [18136743]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать результат SELECT по информации в строковой переменной  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Yuri Abele
Длина expressionToFind у нас не превышает 10.

Блин, так в чем тогда проблема? PATINDEX:

ORDER BY PATINDEX(N',' + col1 + N',', N',' + @OrderBy + N',')

Где @OrderBy NVARCHAR(MAX)
11 сен 15, 11:32    [18136779]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить