ultimos seleccionar registros primeros parte obtener numericas los funciones example ejemplos desde cero sql oracle numbers

seleccionar - ORACLE SQL: Obtener todos los enteros entre dos números



seleccionar los primeros 10 registros sql server (12)

¿Hay alguna manera de seleccionar los números (enteros) que se incluyen entre dos números con SQL en Oracle; No quiero crear un procedimiento o función PL / SQL.

Por ejemplo, necesito obtener los números entre 3 y 10. El resultado serán los valores 3,4,5,6,7,8,9,10.

Gracias.


Acabo de hacer una función de tabla de valores para hacer esto en el servidor SQL, si alguien está interesado, esto funciona perfectamente.

CREATE FUNCTION [dbo].[NumbersBetween] ( @StartN int, @EndN int ) RETURNS @NumberList table ( Number int ) AS BEGIN WHILE @StartN <= @EndN BEGIN insert into @NumberList VALUES (@StartN) set @StartN = @StartN + 1 END Return END GO

Si ejecuta la consulta: "seleccione * de dbo.NumbersBetween (1,5)" (sin las comillas por supuesto) el resultado será

Number ------- 1 2 3 4 5


Esta es una adición tardía. Pero la solución parece ser más elegante y más fácil de usar.

Utiliza una función canalizada que debe instalarse una vez:

CREATE TYPE number_row_type AS OBJECT ( num NUMBER ); CREATE TYPE number_set_type AS TABLE OF number_row_type; CREATE OR REPLACE FUNCTION number_range(p_start IN PLS_INTEGER, p_end IN PLS_INTEGER) RETURN number_set_type PIPELINED IS out_rec number_row_type := number_row_type(NULL); BEGIN FOR i IN p_start .. p_end LOOP out_rec.num := i; pipe row(out_rec); END LOOP; END number_range; /

Entonces puedes usarlo así:

select * from table(number_range(1, 10)); NUM --- 1 2 3 4 5 6 7 8 9 10

La solución es específica de Oracle.


Este truco con la tabla DUAL de Oracle también funciona:

SQL> select n from 2 ( select rownum n from dual connect by level <= 10) 3 where n >= 3; N ---------- 3 4 5 6 7 8 9 10


Gary, para mostrar el resultado que explicó, la consulta modelo será:

SELECCIONE c1 DE LA DIMENSIÓN DEL MODELO DUAL POR (1 como rn)
MEDIDAS (1 como c1) REGLAS ITERATE (8) (c1 [ITERATION_NUMBER] = ITERATION_NUMBER + 3) ORDEN POR rn

;)

Yo siempre uso:

SELECCIONAR (NIVEL - 1) + 3 como resultado DESDE CONEXIÓN DOBLE POR Nivel <= 8

Donde 3 es el número de inicio y 8 es el número de "iteraciones".


Lo primero que hago cuando creo una nueva base de datos es crear y completar algunas tablas básicas.

Una es una lista de todos los enteros entre -N y N, otra es una lista de fechas de 5 años en el pasado a lo largo de 10 años en el futuro (un trabajo programado puede continuar creando estos según sea necesario, en el futuro) y la última es una lista De todas las horas durante todo el día. Por ejemplo, los inetgers:

create table numbers (n integer primary key); insert into numbers values (0); insert into numbers select n+1 from numbers; commit; insert into numbers select n+2 from numbers; commit; insert into numbers select n+4 from numbers; commit; insert into numbers select n+8 from numbers; commit; insert into numbers select n+16 from numbers; commit; insert into numbers select n+32 from numbers; commit; insert into numbers select n+64 from numbers; commit; insert into numbers select n+128 from numbers; commit; insert into numbers select n+256 from numbers; commit; insert into numbers select n+512 from numbers; commit; insert into numbers select n+1024 from numbers; commit; insert into numbers select n+2048 from numbers; commit; insert into numbers select n+4096 from numbers; commit; insert into numbers select n+8192 from numbers; commit; insert into numbers select -n from numbers where n > 0; commit;

Esto es para DB2 / z, que tiene inicio de transacción automático, por lo que parece tener compromisos desnudos.

Sí, ocupa un espacio (mínimo) pero hace que las consultas sean mucho más fáciles de escribir, simplemente seleccionando valores de esas tablas. También es muy portátil a través de casi cualquier DBMS basado en SQL.

Su consulta particular sería entonces un simple:

select n from numbers where n >=3 and n <= 10;

Las cifras horarias y los rangos de fechas son muy útiles para el tipo de aplicaciones de informes en las que trabajamos. Nos permite crear entradas cero para esas horas del día (o fechas) que no tienen datos reales, de modo que, en lugar de (donde no hay datos el segundo del mes):

Date | Quantity -----------+--------- 2009-01-01 | 7 2009-01-03 | 27 2009-01-04 | 6

en lugar de eso podemos obtener:

Date | Quantity -----------+--------- 2009-01-01 | 7 2009-01-02 | 0 2009-01-03 | 27 2009-01-04 | 6


O puedes usar Entre

Select Column1 from dummy_table where Column2 Between 3 and 10


Puedes usar la cláusula MODEL para esto.

SELECT c1 from dual MODEL DIMENSION BY (1 as rn) MEASURES (1 as c1) RULES ITERATE (7) (c1[ITERATION_NUMBER]=ITERATION_NUMBER+7)


Quiero compartir una consulta útil que convierte una cadena de comas y una lista de números separados por ''-'' en una lista de números expandida equivalente:

Un ejemplo que convierte ''1,2,3,50-60'' en

1 2 3 50 51 ... 60

select distinct * from (SELECT (LEVEL - 1) + mini as result FROM (select REGEXP_SUBSTR (value, ''[^-]+'', 1, 1)mini ,nvl(REGEXP_SUBSTR (value, ''[^-]+'', 1, 2),0) maxi from (select REGEXP_SUBSTR (value, ''[^,]+'', 1, level) as value from (select ''1,2,3,50-60'' value from dual) connect by level <= length(regexp_replace(value,''[^,]*''))+1)) CONNECT BY Level <= (maxi-mini+1)) order by 1 asc;

Puede usarlo como una vista y parametrizar la cadena ''1,2,3,50-60''


Una forma de generar números desde el rango es usar XMLTABLE(''start to end'') :

SELECT column_value FROM XMLTABLE(''3 to 10'');

Demostración de DBFiddle


esta consulta de una sola línea te ayudará,

select level lvl from dual where level<:upperbound and level >:lowerbound connect by level<:limt

Para su caso:

select level lvl from dual where level<10 and level >3 connect by level<11

Déjame saber si hay alguna aclaración.


create table numbers (value number); declare x number; begin for x in 7 .. 25 loop insert into numbers values (x); end loop; end; /


SQL> var N_BEGIN number SQL> var N_END number SQL> exec :N_BEGIN := 3; :N_END := 10 PL/SQL procedure successfully completed. SQL> select :N_BEGIN + level - 1 n 2 from dual 3 connect by level <= :N_END - :N_BEGIN + 1 4 / N ---------- 3 4 5 6 7 8 9 10 8 rows selected.

Esto usa el mismo truco que el de Tony. Tenga en cuenta que cuando está utilizando SQL * Plus 9, debe hacer de esta consulta una vista en línea como Tony le mostró. En SQL * Plus 10 o superior, lo anterior es suficiente.

Saludos, Rob.