|
Разбить строку запросом | ☑ | ||
---|---|---|---|---|
0
botanik
26.04.12
✎
13:13
|
Добрый день товарищи программисты.
Есть ТЗ с одной колонкой: Тип(Строка) имеет вид: "а,аа,а,ааа,аа,ааааа,аа" Символы разделены запятыми. Можно ли в запросе сделать: "а" "аа" "а" "ааа" "аа" "ааааа" "аа" Разложить в отдельные строки по резделителю. Если можно, то как? Заранее благодарю! |
|||
1
andrewks
26.04.12
✎
13:17
|
это у тебя лабораторная?
|
|||
2
ДенисЧ
26.04.12
✎
13:18
|
А запрос тут причём?
|
|||
3
DimVad
26.04.12
✎
13:19
|
Думаю - сперва надо с ТЗ подхимичить. Т.е. Добавить колонки, строки ТЗ обойти циклом - разбивать строку на подстроку программно. Потом запихнуть ТЗ в запрос и дальше уже можно будет извращаться с запросом.
|
|||
4
mrd2006
26.04.12
✎
13:22
|
почему именно запросом?
|
|||
5
fisher
26.04.12
✎
13:24
|
(0) Парсить строки из ТЗ запросом? Мусью знает толк в извращениях.
|
|||
6
Fish
26.04.12
✎
13:24
|
Дарю из типовой:
// Функция "расщепляет" строку на подстроки, используя заданный // разделитель. Разделитель может иметь любую длину. // Если в качестве разделителя задан пробел, рядом стоящие пробелы // считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр // игнорируются. // Например, // РазложитьСтрокуВМассивПодстрок(",один,,,два", ",") возвратит массив значений из пяти элементов, // три из которых - пустые строки, а // РазложитьСтрокуВМассивПодстрок(" один два", " ") возвратит массив значений из двух элементов // // Параметры: // Стр - строка, которую необходимо разложить на подстроки. // Параметр передается по значению. // Разделитель - строка-разделитель, по умолчанию - запятая. // // Возвращаемое значение: // массив значений, элементы которого - подстроки // Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт МассивСтрок = Новый Массив(); Если Разделитель = " " Тогда Стр = СокрЛП(Стр); Пока 1 = 1 Цикл Поз = Найти(Стр, Разделитель); Если Поз = 0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр, Поз - 1)); Стр = СокрЛ(Сред(Стр, Поз)); КонецЦикла; Иначе ДлинаРазделителя = СтрДлина(Разделитель); Пока 1 = 1 Цикл Поз = Найти(Стр, Разделитель); Если Поз = 0 Тогда Если (СокрЛП(Стр) <> "") Тогда МассивСтрок.Добавить(Стр); КонецЕсли; Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз - 1)); Стр = Сред(Стр, Поз + ДлинаРазделителя); КонецЦикла; КонецЕсли; КонецФункции |
|||
7
andrewks
26.04.12
✎
13:25
|
(6) а где запрос?
|
|||
8
Cube
26.04.12
✎
13:25
|
(0) Только если запятые на одинаковых позициях всегда. Иначе никак.
|
|||
9
DimVad
26.04.12
✎
13:26
|
Наверное есть поле с неструктурированной информацией. Им надо в запросе получить в структурированном виде. Поэтому, сперва как в (6), потом - ТЗ в запрос.
|
|||
10
fisher
26.04.12
✎
13:26
|
(7) Доработать несложно. Загнать результат во временную таблицу... :)
|
|||
11
andrewks
26.04.12
✎
13:26
|
(8) можно, но тогда текст запроса будет динамическим
|
|||
12
andrewks
26.04.12
✎
13:26
|
(10) это не по заданию
|
|||
13
fisher
26.04.12
✎
13:28
|
(12) Ага. А динамический запрос по результатам парсинга - это типа по заданию :)
|
|||
14
andrewks
26.04.12
✎
13:28
|
(13) ну, согласись, условия на статичность текста запроса в сабже нет ;-)
|
|||
15
Cube
26.04.12
✎
13:29
|
(11) Почему динамическим? Функция ПОДСТРОКА прекрасно выдернет что нужно.
|
|||
16
andrewks
26.04.12
✎
13:30
|
(15) ну, если брать за входные данные только приведённые в сабже, то да
|
|||
17
andrewks
26.04.12
✎
13:30
|
кстати, да, это вполне может быть тест на логику
|
|||
18
andrewks
26.04.12
✎
13:48
|
кстати, вроде бы задача имеет решение в виде статического запроса для произвольных букв, разделённых запятыми
|
|||
19
Cube
26.04.12
✎
13:49
|
(18) с условием (8)
|
|||
20
andrewks
26.04.12
✎
13:52
|
(19) в том-то и дело, что с любыми позициями запятых. но это надо вдумчиво покодить, а сейчас времени нет. может, вечерком поразвлекаюсь
|
|||
21
Cube
26.04.12
✎
14:00
|
(20) Да ну? Не взлетит... :)
|
|||
22
andrewks
26.04.12
✎
14:02
|
(21)на спор забьём? :)))
|
|||
23
Cube
26.04.12
✎
14:06
|
(22) Много нюансов в ТЗ, выкрутится любой))) Но я считаю, что без единой строчки кода и произвольной строкой на входе не взлетит))
|
|||
24
andrewks
26.04.12
✎
14:07
|
(23) зафиксируй условия, может, всё-таки, забьём?
|
|||
25
botanik
26.04.12
✎
14:09
|
Короче это УТ 10.3 регистр вседений Адреса (классификатор), там есть поле наименование, если тип записи "дом", то наименование имеет вид перечисленных домов через запятую, и это все строка.
Хотел в запросе получить каждый дом, его номер, отдельно. В запросе так нельзя, а не в запросе я умею... Всем спасибо!!! |
|||
26
mikecool
26.04.12
✎
14:10
|
(25) там помимо представления есть отдельно 10 полей с каждой частью адреса
|
|||
27
aleks-id
26.04.12
✎
14:12
|
(6) вот жесть... столько строчек вместо одной...
МногострочнаяСтрока = СтрЗаменить(ВходнаяСтрока,СимволРазделитель,Символы.ПС); |
|||
28
Cube
26.04.12
✎
14:13
|
(26) +100! Сразу бы сказал, развели тут демагогию, блин))
|
|||
29
Stim
26.04.12
✎
14:33
|
ВЫБРАТЬ 0 Номер ПОМЕСТИТЬ Цифры ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9;
ВЫБРАТЬ Н1.Номер * 100 + Н2.Номер * 10 + Н3.Номер Номер ПОМЕСТИТЬ Номера ИЗ Цифры Н1 ЛЕВОЕ СОЕДИНЕНИЕ Цифры Н2 ПО ИСТИНА ЛЕВОЕ СОЕДИНЕНИЕ Цифры Н3 ПО ИСТИНА; ВЫБРАТЬ &ИсходнаяСтрока + &Разделитель Текст ПОМЕСТИТЬ Строка; ВЫБРАТЬ ПОДСТРОКА(Текст, Н + 1, К - Н - 1) ИЗ ( ВЫБРАТЬ Номера.Номер Н ,МИНИМУМ(Н.Номер) К ,МАКСИМУМ(Н.Номер) Макс ,Строка.Текст ИЗ Номера ВНУТРЕННЕЕ СОЕДИНЕНИЕ Строка ПО ПОДСТРОКА(Строка.Текст, Номера.Номер, 1) ПОДОБНО "[" + &Разделитель + "]" ИЛИ Номер = 0 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Номера Н ПО ПОДСТРОКА(Строка.Текст, Н.Номер, 1) ПОДОБНО "[" + &Разделитель + "]" И Н.Номер > Номера.Номер СГРУППИРОВАТЬ ПО Номера.Номер ,Строка.Текст )ВЗ |
|||
30
botanik
26.04.12
✎
14:50
|
...!!!))
Stim, спасибо!!!!Не знаю как, но РАБОТАЕТ!!!)))) |
|||
31
Stim
26.04.12
✎
14:55
|
(30) мопед не мой(с)
|
|||
32
fisher
26.04.12
✎
15:40
|
(29) Остроумно :) Откуда это чудо?
"МАКСИМУМ(Н.Номер) Макс" - эта строчка лишняя и длина строки ограничена 1000 символов. |
|||
33
Stim
26.04.12
✎
16:46
|
(32) писал не я. написано на коленке за 10 минут, вручную без конструктора)
|
|||
34
fisher
26.04.12
✎
16:51
|
(33) И непонятно, нафига ПОДОБНО когда тупо равенство канает.
|
|||
35
mikecool
26.04.12
✎
16:53
|
(33) толи в кз толи в бзне есть этот пример
|
|||
36
Stim
26.04.12
✎
16:55
|
(34) равенство не канает, когда разделитель пробел
|
|||
37
fisher
26.04.12
✎
17:06
|
(36) В самом деле... Только я не совсем догоняю, почему...
|
|||
38
IKSparrow
26.04.12
✎
17:11
|
(33) Кто писал?
|
|||
39
Stim
26.04.12
✎
17:11
|
(38) коллега
|
|||
40
IKSparrow
26.04.12
✎
17:15
|
(39) Жму руку. Молодец.
|
|||
41
andrewks
26.04.12
✎
18:02
|
как обещал, вот вам взрыв мозга под конец рабочего дня :)
|
|||
42
fisher
26.04.12
✎
18:11
|
Слоупок :)
|
|||
43
IKSparrow
26.04.12
✎
19:41
|
(41) А тырить код не хорошо. с SQL.RU.
|
|||
44
ILM
гуру
26.04.12
✎
20:17
|
(28) А теперь обратно? Из записей получить строку назад с разделителями :-)
Запрос хорош! |
|||
45
andrewks
26.04.12
✎
20:54
|
(43) за базар отвечаешь? теперь с тебя ссылка, иначе будешь пустозвоном
|
|||
46
Cube
27.04.12
✎
05:38
|
(29) (41) Красавчики!)) В связи таблиц использовать ПОДСТРОКА() - хитро)) Не, действительно круто, снимаю шляпу)
|
|||
47
ILM
гуру
27.04.12
✎
09:44
|
(29) Повторюсь, а обратно возможно? С помощью запроса собрать строки с разделителем
|
|||
48
ILM
гуру
27.04.12
✎
09:45
|
И вопрос а две колонки сделать с двумя разделителями. Я бы тогда уровень вложенности полуфабриката так бы сохранил.
|
|||
49
Stim
27.04.12
✎
09:58
|
и кто-нибудь - оформите статью в базе знаний
|
|||
50
Cube
27.04.12
✎
10:00
|
(47) Что мешает написать:
&Параметр1 + "," + &Параметр2 + "," + &Параметр3 ? |
|||
51
andrewks
27.04.12
✎
10:07
|
(49) готово, сэр!
|
|||
52
ILM
гуру
27.04.12
✎
10:32
|
А параметр это строка таблицы?
|
|||
53
Cube
27.04.12
✎
10:33
|
(52) Да, один параметр, это одна строка.
|
|||
54
Stim
27.04.12
✎
10:48
|
(51) эммм.. я имел ввиду это: http://kb.mista.ru/
но и так сойдет |
|||
55
ILM
гуру
27.04.12
✎
11:22
|
(53) До чего же нерусский народ пошел.
Есть таблица результат другого запроса в ней одно поле "Текст1" и 10 строк: а1 а2 б3 б5 б7 б8 в10 в12 д15 е10 КАК запросом получить одну запись со строкой? Результат а1,а2,б3,б5,б7,б8,в10,в12,д15,е10 где "," это разделитель. |
|||
56
ILM
гуру
27.04.12
✎
12:48
|
апну разок
|
|||
57
Stim213
27.04.12
✎
12:57
|
(56) 100$
|
|||
58
Cube
27.04.12
✎
14:06
|
(55) Ну так объясняй по-русски, епта))
|
|||
59
ILM
гуру
27.04.12
✎
16:13
|
(57) Запросом 1C? Крохобор ))))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |