상수로 채워진 여러 행을 선택하는 방법은 무엇입니까?
테이블을 참조하지 않고 상수를 선택하는 것은 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 Server
및 PostgreSQL
, 또한 행 (외부 변수 제공 가능한) 임의의 수의 레코드를 생성 할 수있다 :
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
.
VALUES
PostgreSQL에서 다음과 같은 베어 명령이 작동합니다.
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
'Programming' 카테고리의 다른 글
팬더에서 특정 열 이름 바꾸기 (0) | 2020.06.13 |
---|---|
Redis는 단일 스레드이며 동시 I / O는 어떻게 수행합니까? (0) | 2020.06.13 |
작업 공간에서 몇 가지 특정 객체 만 지우려면 어떻게해야합니까? (0) | 2020.06.13 |
Moq로 특정 매개 변수 확인 (0) | 2020.06.13 |
Android 8.1로 업그레이드 한 후 startForeground가 실패 함 (0) | 2020.06.13 |