source

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

lovecheck 2023. 8. 10. 18:54
반응형

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

테이블을 참조하지 않고 상수를 선택하는 것은 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.

Microsoft SQL Server 또는 Postgre의 경우SQL 이 구문을 사용해 보십시오.

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에서도 볼 수 있습니다.

다음 벌거VALUESPostgre에서 명령어가 작동합니다.SQL:

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

Oracle. 이 게시물 PL/SQL 덕분에 - Where In 절에서 "List" 변수 사용

(테스트자가 애플리케이션을 테스트할 때 재사용되는) 값을 쉽게 수동으로 입력할 수 있도록 예제 문장을 작성했습니다.

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

오라클에서 connect by clause를 시도해 보십시오, 이런 것들입니다.

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

절별 연결에 대한 자세한 내용을 보려면 다음 링크를 따르십시오. Oraclebin 사이트가 이제 악의적이기 때문에 제거된 URL입니다.

SELECT * 
FROM DUAL 
CONNECT BY ROWNUM <= 9;

다음은 깔끔한 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 );

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

MySQL 요청으로 직접 사용자 지정 행을 만드는 방법SELECT:

SELECT ALL *
FROM (
    VALUES
        ROW (1, 2, 3),
        ROW (4, 5, 6),
        ROW (7, 8, 9)
) AS dummy (c1, c2, c3)

우리에게 테이블을 줍니다.dummy:

c1   c2   c3
-------------
 1    2    3
 4    5    6
 7    8    9

테스트 대상MySQL 8

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

MySQL에서 다음 작업을 수행할 수 있습니다.values (1,2), (3, 4);

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

MySQL 8을 사용하면 열 이름을 지정할 수도 있습니다.

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

Oracle SQL에서 사용할 수 있습니다.JSON_TABLEJSON에서 테이블을 만드는 방법

SELECT
   t.emp_name,
   t.emp_age
FROM
   JSON_TABLE (
   '{
     "employees": [{name:"Alice", age: 19}, {name: "Bob", age: 23}]
  }',
  '$'
  COLUMNS (
     NESTED PATH '$.employees[*]'
     COLUMNS (
        emp_name VARCHAR2(50) PATH '$.name',
        emp_age NUMBER(3,0) PATH '$.age'
     )
  )
) t;

오라클에서

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

SQLite3의 경우 다음과 같이 Go를 선택합니다.컨텍스트() 쿼리

VALUES (1), (2)

이름이 "Column1"인 단일 열과 값이 1 및 2인 두 행을 반환합니다.

VALUE는 단순 SELECT 문 https://www.sqlite.org/lang_select.html#simpleselect 의 특수 형식입니다.

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:레코드가 3개 이상 들어 있는 테이블을 선택하거나 시스템 테이블을 사용합니다.여기서 우리는 그 표의 데이터와 관련이 없습니다.

다 의 음 첫 번 째 번 세 및 열 연 째 과 결 하 을 여 있 가 다 수 니 습 올 져 변 결 집 을 두 동째 번 에 합 과 ▁from ▁columns ▁you ▁set ▁third ▁with , ▁first ▁and ▁vari ▁column 열 ▁by ▁second ▁conc ▁result ▁bring ▁a 을 aten 다 ating ▁in ations ▁can 음 두 번 의 첫 있 째 다 , 니 수 습Any_Table_In_Your_DataBase

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;

그런 거.

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

반응형