deniskoua
(denisko.ua)
#1
Есть следующие условия:
1) База Oracle (стандартный набор PL/SQL)
2) У пользователя есть права только на чтение
3) Есть таблица table_a
4) В ней есть N записей с 3мя колонками
{syntaxhighlighter brush: sql;fontsize: 100; first-line: 1; }select * from table_a{/syntaxhighlighter}
FirstName |
LastName |
City |
Den |
Pupkin |
Kiev |
Oleg |
Richy |
Lviv |
Задача:Написать такой select чтоб возвращал все записи из всех колонок в одной строке.
Например вот так: "Den Pupkin Kiev || Oleg Richy Lviv ||"
Serge
(Serge)
#2
Самое простое будет типа:
select t.first_name ||' '|| t.Last_name ||' '|| m.first_name ||' '|| m.Last_name from users t, users m
Ну а дальше ставишь where, и другие украшения
deniskoua
(denisko.ua)
#3
Да, но при таком запросе он выдаст несколько строк со слепленными вместе столбцами.
А вопрос - как слепить в одну строку несколько строк из результата?
Serge
(Serge)
#4
В моем примере, если добавить WHERE с нужным критерием результатом будет 1 строка со слеплеными 2мя записями из таблицы, что и требовалось. Например,
select t.first_name ||' '|| t.Last_name ||' '|| m.first_name ||' '|| m.Last_name from users t, users m where t.last_name < m.last_name
(будет работать, если фамилии не одинаковы)
Если же нужно "слепить" произвольное количество записей, то не в курсе как это сделать на чистом SQL, если это вообще возможно
Serge
(Serge)
#6
В PLSQL есть циклы, можно сделать многое. но я в нем 0
deniskoua
(denisko.ua)
#7
Итак, после гуглевания я нашёл пару способов, опробовал их, подправил..
И вот что получилось:
{syntaxhighlighter brush: sql;fontsize: 100; first-line: 1; }SELECT sys_xmlagg(xmlelement(col, FirstName|| ' ' ||LastName|| ' ' ||City||' || ')).extract('//text()').getclobval() AS result
FROM table_a
;{/syntaxhighlighter}
Use the dark XML power....
polusok
(Mykhailo Poliarush)
#8
Интересно, а сколько это действие по времени занимает? Это наверное ресурсоемкая задача.