Как сделать набор результатов из ('1', '2', '3')? - PullRequest
1 голос
/ 24 июля 2009

У меня вопрос, как я могу создать результирующий набор, составив только список значений. Например, у меня есть такие значения: ('1','2','3') И я хочу сделать sql, который возвращает такую ​​таблицу:

1
2
3

Спасибо.

[Редактировать]

Извините занеправильный вопросНа самом деле список не содержит целых чисел, но содержит строки. В настоящее время мне нужно, как («АА», «ББ,« Копия »).

[/ Edit]

Ответы [ 4 ]

3 голосов
/ 24 июля 2009

Если вы хотите написать оператор SQL, который будет принимать отдельный список запятых и генерировать произвольное количество фактически строк, единственный реальный способ - использовать табличную функцию, которая вызывает функцию PL / SQL, которая разбивает входную строкуи возвращает элементы в виде отдельных строк.

Проверьте эту ссылку для ознакомления с табличными функциями.

В качестве альтернативы, если вы можете программно построить оператор SQL в своемклиент, который вы можете сделать:

SELECT 'aa' FROM DUAL
UNION
SELECT 'bb' FROM DUAL
UNION
SELECT 'cc' FROM DUAL
1 голос
/ 25 июля 2009

Лучший способ, который я нашел, - это использование XML.


SELECT items.extract('/l/text()').getStringVal() item
FROM TABLE(xmlSequence(
        EXTRACT(XMLType(''||
        REPLACE('aa,bb,cc',',','')||'')
          ,'/all/l'))) items;

Хотел бы я взять кредит, но, увы: http://pbarut.blogspot.com/2006/10/binding-list-variable.html.

По сути, это преобразование списка вЗатем xmldocument разобрать его.

1 голос
/ 24 июля 2009

Один прием, который я использовал в различных системах баз данных (не только в базах данных SQL), заключается в том, чтобы иметь таблицу, которая содержит только первые 100 или 1000 целых чисел. Такую таблицу очень легко создать программно, и тогда ваш запрос станет:

SELECT value FROM numbers WHERE value < 4 ORDER BY value

Вы можете использовать таблицу для множества похожих целей.

1 голос
/ 24 июля 2009

Самый простой способ - использовать таблицу, в которой гарантированно достаточно строк.

-- for Oracle
select rownum from tab where rownum < 4;

Если это невозможно, ознакомьтесь с Oracle Row Generator Techniques .

Мне нравится этот (требуется 10 г):

select integer_value
from   dual
where  1=2
model
  dimension by ( 0 as key )
  measures     ( 0 as integer_value )
  rules upsert ( integer_value[ for key from 1 to 10 increment 1 ] = cv(key) )
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...