Имя: Пароль:
1C
1С v8
Разбить строку запросом
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
как обещал, вот вам взрыв мозга под конец рабочего дня :)


select
&SrcStr as str
into InpTbl

;
// здесь создаём ВТ цифр

select
0 as num
into digits
union select 1 union select 2 union select 3 union select 4 union select 5
union select 6 union select 7 union select 8 union select 9

;
// здесь создаём ВТ чисел

select
digits1.num+10*digits2.num+100*digits3.num as num
into numbers
from
digits as digits1
,digits as digits2
,digits as digits3
index by num

;
// здесь разбираем входную строку, составляем таблицу позиций разделителей

select 0 as pos
into delimtbl
union
select
numbers.num
from
InpTbl as tabstr
left join
numbers
on (numbers.num>0) and (substring(tabstr.str,numbers.num,1)=",")
union
select
max(numbers.num)+1
from
InpTbl as tabstr
left join
numbers
on (numbers.num>0) and (substring(tabstr.str,numbers.num,1)>"")
index by pos

;

// здесь составляем таблицу позиций подстрок

select
delimtbl1.pos as pos1
,min(delimtbl2.pos) as pos2
into delimstbl
from
delimtbl as delimtbl1, delimtbl as delimtbl2
where (delimtbl2.pos>delimtbl1.pos)
group by delimtbl1.pos

;

// финал :)

select
substring(tabstr.str,delimstbl.pos1+1,delimstbl.pos2-delimstbl.pos1-1) as atom
from
InpTbl as tabstr
left join
delimstbl
on (true)
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? Крохобор ))))