Выбран из набранного набора - PullRequest
0 голосов
/ 03 января 2012

Как выбрать из набранного набора в Oracle 10g?

т.е. SELECT * FROM (3,5,20,68,54,13,56,899,1)

Кроме того, как бы это отфильтровать?

т.е. SELECT * FROM (3,5,20,68,54,13,56,899,1) WHERE > 5

1 Ответ

2 голосов
/ 03 января 2012

Откуда поступают данные и что вы планируете делать с ними?

Если данные читаются из файла, вы обычно создаете внешнюю таблицу для чтения из файла или используете SQL * Loader или другой инструмент ETL для загрузки данных в промежуточную таблицу или коллекцию PL / SQL, которая Вы можете запросить

SQL> create type num_tbl is table of number;
  2  /

Type created.

SQL> ed
Wrote file afiedt.buf

  1  declare
  2    l_nums num_tbl := num_tbl( 3, 5, 20, 68, 54 );
  3  begin
  4    for x in (select * from table(l_nums))
  5    loop
  6      dbms_output.put_line( x.column_value );
  7    end loop;
  8* end;
SQL> /
3
5
20
68
54

Если вы выполняете какую-то ручную обработку, вы обычно искали бы данные из другой таблицы, т.е.

SELECT *
  FROM some_other_table
 WHERE some_key IN (3, 5, 20, 68, 54, 13, 56, 889, 1 );

Если вы действительно пытаетесь сгенерировать набор данных, полный произвольных данных, извлеченных из файла, который вы не хотите использовать Oracle для чтения, вы всегда можете сделать серию SELECT операторов из DUAL все UNION ALL были бы вместе, но это, очевидно, становится довольно громоздким.

WITH sample_data
  AS (SELECT 3 num FROM dual UNION ALL
      SELECT 5 FROM dual UNION ALL
      SELECT 20 FROM dual UNION ALL
      SELECT 68 FROM dual UNION ALL
      SELECT 54 FROM dual UNION ALL
      ...
      SELECT 1 FROM dual)
 SELECT *
   FROM sample_data
  WHERE num > 5;

Кроме того, используя предложение WITH и строку CSV, мы можем проанализировать строку как таблицу. Пример:

VARIABLE liste VARCHAR2(100)

EXECUTE :liste := '5, 25, 41, 52'; 

WITH liste AS (
  SELECT SUBSTR(:liste, INSTR(','||:liste||',', ',', 1, rn),
  INSTR(','||:liste||',', ',', 1, rn+1) - 
  INSTR(','||:liste||',', ',', 1, rn)-1) valeur
FROM (
  SELECT ROWNUM rn FROM DUAL
  CONNECT BY LEVEL<=LENGTH(:liste) - LENGTH(REPLACE(:liste,',',''))+1))
SELECT TRIM(valeur)
FROM liste;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...