sql select constants

sql - ¿Cómo seleccionar múltiples filas llenas de constantes?



select constants (11)

Seleccionar constantes sin consultar una tabla es perfectamente legal en una declaración SQL:

SELECT 1, 2, 3

El conjunto de resultados que este último devuelve es una sola fila que contiene los valores. Me preguntaba si hay una manera de seleccionar varias filas a la vez usando una expresión constante, algo así como:

SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))

Me gustaría que algo como lo anterior funcione y devuelva un conjunto de resultados con 3 filas y 3 columnas.


Aquí es cómo llenó datos estáticos en Oracle 10+ usando un truco de XML ordenado.

create table prop (ID NUMBER, NAME varchar2(10), VAL varchar2(10), CREATED timestamp, CONSTRAINT PK_PROP PRIMARY KEY(ID) ); merge into Prop p using ( select extractValue(value(r), ''/R/ID'') ID, extractValue(value(r), ''/R/NAME'') NAME, extractValue(value(r), ''/R/VAL'') VAL from (select xmltype('' <ROWSET> <R><ID>1</ID><NAME>key1</NAME><VAL>value1</VAL></R> <R><ID>2</ID><NAME>key2</NAME><VAL>value2</VAL></R> <R><ID>3</ID><NAME>key3</NAME><VAL>value3</VAL></R> </ROWSET> '') xml from dual) input, table(xmlsequence(input.xml.extract(''/ROWSET/R''))) r ) p_new on (p.ID = p_new.ID) when not matched then insert (ID, NAME, VAL, CREATED) values ( p_new.ID, p_new.NAME, p_new.VAL, SYSTIMESTAMP );

La combinación solo inserta las filas que faltan en la tabla original, lo cual es conveniente si desea volver a ejecutar su script de inserción.


Aquí se muestra cómo hacerlo usando las características XML de DB2

SELECT * FROM XMLTABLE (''$doc/ROWSET/ROW'' PASSING XMLPARSE ( DOCUMENT '' <ROWSET> <ROW> <A val="1" /> <B val="2" /> <C val="3" /> </ROW> <ROW> <A val="4" /> <B val="5" /> <C val="6" /> </ROW> <ROW> <A val="7" /> <B val="8" /> <C val="9" /> </ROW> </ROWSET> '') AS "doc" COLUMNS "A" INT PATH ''A/@val'', "B" INT PATH ''B/@val'', "C" INT PATH ''C/@val'' ) AS X ;


De esta manera puede ayudarte

SELECT TOP 3 1 AS First, 2 AS Second, 3 AS Third FROM Any_Table_In_Your_DataBase

Any_Table_In_Your_DataBase: cualquier tabla que contenga más de 3 registros, o use cualquier tabla del sistema. Aquí no tenemos ninguna preocupación con los datos de esa tabla.

Puede traer variaciones en el conjunto de resultados al concatenar una columna con las columnas Primera, Segunda y Tercera de la tabla Any_Table_In_Your_DataBase .


En PostgreSQL , puedes hacer:

SELECT * FROM ( VALUES (1, 2), (3, 4) ) AS q (col1, col2)

En otros sistemas, solo use UNION ALL :

SELECT 1 AS col1, 2 AS col2 -- FROM dual -- uncomment the line above if in Oracle UNION ALL SELECT 3 AS col1, 3 AS col2 -- FROM dual -- uncomment the line above if in Oracle

En Oracle , SQL Server y PostgreSQL , también puede generar conjuntos de registros de número arbitrario de filas (providable con una variable externa):

SELECT level FROM dual CONNECT BY level <= :n

en Oracle ,

WITH q (l) AS ( SELECT 1 UNION ALL SELECT l + 1 FROM q WHERE l < @n ) SELECT l FROM q -- OPTION (MAXRECURSION 0) -- uncomment line above if @n >= 100

en SQL Server ,

SELECT l FROM generate_series(1, $n) l

en PostgreSQL .


En Oracle

SELECT CASE WHEN level = 1 THEN ''HI'' WHEN level = 2 THEN ''BYE'' END TEST FROM dual CONNECT BY level <= 2;


Oráculo. Gracias a este post PL / SQL - Use la variable "List" en Where In Clause

Junté mi declaración de ejemplo que es fácil de ingresar valores manualmente (siendo reutilizados al probar una aplicación por probadores):

WITH prods AS ( SELECT column_value AS prods_code FROM TABLE( sys.odcivarchar2list( ''prod1'', ''prod2'' ) ) ) SELECT * FROM prods


Pruebe la cláusula connect by en oráculo, algo como esto

select level,level+1,level+2 from dual connect by level <=3;

Para obtener más información sobre la cláusula connect by, siga este enlace: URL eliminada porque el sitio oraclebin ahora es malicioso.


Seguir el comando bare VALUES funciona para mí en PostgreSQL:

VALUES (1,2,3), (4,5,6), (7,8,9)


Una opción para DB2:

SELECT 101 AS C1, 102 AS C2 FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT 201 AS C1, 202 AS C2 FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT 301 AS C1, 302 AS C2 FROM SYSIBM.SYSDUMMY1


SELECT * FROM DUAL CONNECT BY ROWNUM <= 9;


SELECT 1, 2, 3 UNION ALL SELECT 4, 5, 6 UNION ALL SELECT 7, 8, 9