카테고리:

반정형 및 정형 데이터 함수 (배열/오브젝트)

OBJECT_CONSTRUCT

인자에서 생성된 OBJECT 를 반환합니다.

참고 항목:

OBJECT_CONSTRUCT_KEEP_NULL

구문

OBJECT_CONSTRUCT( [<key>, <value> [, <key>, <value> , ...]] )

OBJECT_CONSTRUCT(*)
Copy

인자

key

키-값 페어의 키. 각각의 키는 VARCHAR 값입니다.

value

키와 연결된 값입니다. 이 값은 어떤 데이터 타입이든 될 수 있습니다.

*

별표(와일드카드)로 호출하는 경우 특성 이름을 키로, 연관된 값을 값으로 사용하여 지정된 데이터에서 OBJECT 값이 생성됩니다. 아래의 예를 참조하십시오.

함수에 와일드카드를 전달할 때 와일드카드를 테이블의 이름이나 별칭으로 한정할 수 있습니다. 예를 들어, mytable 이라는 테이블의 모든 열을 전달하려면 다음을 지정하십시오.

(mytable.*)
Copy

필터링을 위해 ILIKE 및 EXCLUDE 키워드를 사용할 수도 있습니다.

  • ILIKE는 지정된 패턴과 일치하는 열 이름을 필터링합니다. 패턴은 하나만 허용됩니다. 예:

    (* ILIKE 'col1%')
    
    Copy
  • EXCLUDE는 지정된 열과 일치하지 않는 열 이름을 걸러냅니다. 예:

    (* EXCLUDE col1)
    
    (* EXCLUDE (col1, col2))
    
    Copy

이러한 키워드를 사용할 경우 한정자가 유효합니다. 다음 예에서는 ILIKE 키워드를 사용하여 테이블 mytable 의 패턴 col1% 와 일치하는 모든 열을 필터링합니다.

(mytable.* ILIKE 'col1%')
Copy

ILIKE 및 EXCLUDE 키워드는 단일 함수 호출에서 결합할 수 없습니다.

오브젝트 상수 에 와일드카드를 지정할 수도 있습니다.

이 함수의 경우 ILIKE 및 EXCLUDE 키워드는 SELECT 목록이나 GROUP BY 절에서만 유효합니다.

ILIKE 및 EXCLUDE 키워드에 대한 자세한 내용은 SELECT 의 “매개 변수” 섹션을 참조하십시오.

반환

OBJECT 형식의 값을 반환합니다.

사용법 노트

  • 키 또는 값이 NULL(즉, SQL NULL)인 경우, 결과 오브젝트에서 키-값 페어가 생략됩니다. NULL이 아닌 문자열인 키와 JSON null인 값으로 구성된 키-값 페어(즉, PARSE_JSON('NULL'))는 생략되지 않습니다. 자세한 내용은 VARIANT null 을 참조하십시오.

  • 생성된 오브젝트는 키-값 페어의 원래 순서를 반드시 보존하지는 않습니다.

  • 많은 상황에서 OBJECT_CONSTRUCT 함수 대신 OBJECT 상수 (또는 OBJECT 리터럴 이라고도 함)를 사용할 수 있습니다.

다음 예에서는 간단한 오브젝트를 구성하는 방법을 보여줍니다.

SELECT OBJECT_CONSTRUCT('a', 1, 'b', 'BBBB', 'c', NULL);
Copy
+--------------------------------------------------+
| OBJECT_CONSTRUCT('A', 1, 'B', 'BBBB', 'C', NULL) |
|--------------------------------------------------|
| {                                                |
|   "a": 1,                                        |
|   "b": "BBBB"                                    |
| }                                                |
+--------------------------------------------------+

이 예는 * 를 사용하여 FROM 절에서 속성 이름과 값을 가져옵니다.

CREATE OR REPLACE TABLE demo_table_1 (province VARCHAR, created_date DATE);
INSERT INTO demo_table_1 (province, created_date) VALUES
  ('Manitoba', '2024-01-18'::DATE),
  ('Alberta', '2024-01-19'::DATE);
Copy
SELECT province, created_date
  FROM demo_table_1
  ORDER BY province;
Copy
+----------+--------------+
| PROVINCE | CREATED_DATE |
|----------+--------------|
| Alberta  | 2024-01-19   |
| Manitoba | 2024-01-18   |
+----------+--------------+
SELECT OBJECT_CONSTRUCT(*) AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+---------------------------------+
| OC                              |
|---------------------------------|
| {                               |
|   "CREATED_DATE": "2024-01-19", |
|   "PROVINCE": "Alberta"         |
| }                               |
| {                               |
|   "CREATED_DATE": "2024-01-18", |
|   "PROVINCE": "Manitoba"        |
| }                               |
+---------------------------------+

다음 예에서는 * 를 사용하고 ILIKE 키워드를 포함하여 출력을 필터링합니다.

SELECT OBJECT_CONSTRUCT(* ILIKE 'prov%') AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+--------------------------+
| OC                       |
|--------------------------|
| {                        |
|   "PROVINCE": "Alberta"  |
| }                        |
| {                        |
|   "PROVINCE": "Manitoba" |
| }                        |
+--------------------------+

다음 예에서는 * 를 사용하고 EXCLUDE 키워드를 포함하여 출력을 필터링합니다.

SELECT OBJECT_CONSTRUCT(* EXCLUDE province) AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+--------------------------------+
| OC                             |
|--------------------------------|
| {                              |
|   "CREATED_DATE": "2024-01-18" |
| }                              |
| {                              |
|   "CREATED_DATE": "2024-01-19" |
| }                              |
+--------------------------------+

이 예는 이전 예와 동일하지만, OBJECT_CONSTRUCT 함수 대신 오브젝트 상수를 사용합니다.

SELECT {* EXCLUDE province} AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+--------------------------------+
| OC                             |
|--------------------------------|
| {                              |
|   "CREATED_DATE": "2024-01-18" |
| }                              |
| {                              |
|   "CREATED_DATE": "2024-01-19" |
| }                              |
+--------------------------------+

* 를 사용한 또 다른 예입니다. 이 경우, 특성 이름이 지정되지 않으므로 Snowflake는 COLUMN1, COLUMN2 등을 사용합니다.

SELECT OBJECT_CONSTRUCT(*) FROM VALUES(1,'x'), (2,'y');
Copy
+---------------------+
| OBJECT_CONSTRUCT(*) |
|---------------------|
| {                   |
|   "COLUMN1": 1,     |
|   "COLUMN2": "x"    |
| }                   |
| {                   |
|   "COLUMN1": 2,     |
|   "COLUMN2": "y"    |
| }                   |
+---------------------+

이 예에서는 SQL NULL과 문자열 'null' 을 사용합니다.

SELECT OBJECT_CONSTRUCT(
  'Key_One', PARSE_JSON('NULL'), 
  'Key_Two', NULL, 
  'Key_Three', 'null') AS obj;
Copy
+-----------------------+
| OBJ                   |
|-----------------------|
| {                     |
|   "Key_One": null,    |
|   "Key_Three": "null" |
| }                     |
+-----------------------+

OBJECT_CONSTRUCT는 JSON 오브젝트에서 값을 추가, 수정 또는 생략하기 위한 식 및 쿼리를 지원합니다.

SELECT OBJECT_CONSTRUCT(
    'foo', 1234567,
    'dataset_size', (SELECT COUNT(*) FROM demo_table_1),
    'distinct_province', (SELECT COUNT(DISTINCT province) FROM demo_table_1),
    'created_date_seconds', extract(epoch_seconds, created_date)
  )  AS json_object
  FROM demo_table_1;
Copy
+---------------------------------------+
| JSON_OBJECT                           |
|---------------------------------------|
| {                                     |
|   "created_date_seconds": 1705536000, |
|   "dataset_size": 2,                  |
|   "distinct_province": 2,             |
|   "foo": 1234567                      |
| }                                     |
| {                                     |
|   "created_date_seconds": 1705622400, |
|   "dataset_size": 2,                  |
|   "distinct_province": 2,             |
|   "foo": 1234567                      |
| }                                     |
+---------------------------------------+