Programming

상수로 채워진 여러 행을 선택하는 방법은 무엇입니까?

procodes 2020. 6. 13. 20:10
반응형

상수로 채워진 여러 행을 선택하는 방법은 무엇입니까?


테이블을 참조하지 않고 상수를 선택하는 것은 SQL 문에서 완벽하게 합법적입니다.

SELECT 1, 2, 3

후자가 리턴하는 결과 세트는 값을 포함하는 단일 행입니다. 상수 표현식을 사용하여 한 번에 여러 행을 선택할 수있는 방법이 있는지 궁금합니다.

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

위와 같이 작동하고 3 행과 3 열로 결과 집합을 반환하려고합니다.


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

에서은 PostgreSQL, 당신은 할 수 있습니다 :

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

다른 시스템에서는 다음을 사용하십시오 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

이어 Oracle, SQL ServerPostgreSQL, 또한 행 (외부 변수 제공 가능한) 임의의 수의 레코드를 생성 할 수있다 :

SELECT  level
FROM    dual
CONNECT BY
        level <= :n

에서 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

에서 SQL Server,

SELECT  l
FROM    generate_series(1, $n) l

에서 PostgreSQL.


VALUESPostgreSQL에서 다음과 같은 베어 명령이 작동합니다.

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

오라클에서 connect by 절을 사용해보십시오.

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

connect by 절에 대한 자세한 내용을 보려면 다음 링크를 따르십시오. oraclebin 사이트가 이제 악성이므로 URL을 제거했습니다.


신탁. 이 게시물 덕분에 PL / SQL-절의 "목록"변수 사용

예제 문장을 정리하여 수동으로 값을 쉽게 입력 할 수 있습니다 (테스터가 응용 프로그램을 테스트 할 때 재 사용됨).

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

깔끔한 XML 트릭을 사용하여 Oracle 10 이상에서 정적 데이터를 채우는 방법은 다음과 같습니다.

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 );

병합은 원본 테이블에서 누락 된 행만 삽입하므로 삽입 스크립트를 다시 실행하려는 경우 편리합니다.


SELECT * 
FROM DUAL 
CONNECT BY ROWNUM <= 9;

Microsoft SQL Server 또는 PostgreSQL의 경우이 구문을 사용해 볼 수 있습니다

SELECT constants FROM (VALUES ('foo@gmail.com'), ('bar@gmail.com'), ('baz@gmail.com')) AS MyTable(constants)

여기에서 SQL Fiddle을 볼 수도 있습니다. http://www.sqlfiddle.com/#!17/9eecb/34703/0


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
  CASE
    WHEN level = 1
    THEN 'HI'
    WHEN level = 2
    THEN 'BYE'
  END TEST
FROM dual
  CONNECT BY level <= 2;

DB2의 XML 기능을 사용하여이를 수행하는 방법은 다음과 같습니다.

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
;

이 방법은 당신을 도울 수 있습니다

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

Any_Table_In_Your_DataBase: any table which contains more than 3 records, or use any system table. Here we have no concern with data of that table.

You can bring variations in result set by concatenating a column with First, Second and Third columns from Any_Table_In_Your_DataBase table.


In MySQL, you can do: values (1,2), (3, 4);

mysql> values (1,2), (3, 4);
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
2 rows in set (0.004 sec)

With MySQL 8, it is also possible to give the column names:

mysql> SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c, d);
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+

select (level - 1) * row_dif + 1 as a, (level - 1) * row_dif + 2 as b, (level - 1) * row_dif + 3 as c
    from dual 
    connect by level <= number_of_rows;

something like that

select (level - 1) * 3 + 1 as a, (level - 1) * 3 + 2 as b, (level - 1) * 3 + 3 as c
    from dual 
    connect by level <= 3;

참고URL : https://stackoverflow.com/questions/2201170/how-to-select-multiple-rows-filled-with-constants

반응형