カテゴリ:

半構造化データ関数と構造化データ関数 (配列/オブジェクト)

OBJECT_CONSTRUCT

引数から構築された OBJECT を返します。

こちらもご参照ください。

OBJECT_CONSTRUCT_KEEP_NULL

構文

OBJECT_CONSTRUCT( [<key1>, <value1> [, <keyN>, <valueN> ...]] )

OBJECT_CONSTRUCT( * )
Copy

戻り値

戻り値のデータ型は OBJECT です。

使用上の注意

  • この関数は、次のいずれかを受け入れます。

    • 0個以上のキーと値のペアにおけるシーケンス(キーは文字列で、値は任意の型)。

    • アスタリスク。アスタリスクで呼び出されると、オブジェクトは属性名をキーとして、関連するタプル値を値として使用して構築されます。以下の例をご参照ください。

  • キーまたは値が NULL (つまり SQL NULL)の場合、キーと値のペアは結果のオブジェクトから省略されます。キーとしてnull以外の文字列と、値として JSON NULL で構成されるキーと値のペア(つまり、PARSE_JSON('NULL'))は省略されません。

  • 構築されたオブジェクトは、キーと値のペアの元の順序を保持するとは限りません。

  • 多くのコンテキストでは、OBJECT_CONSTRUCT関数の代わりに OBJECT定数OBJECTリテラル とも呼ばれます)を使用できます。

これは、単純なオブジェクトを作成する方法を示しています。

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

この例では、 * を使用して、 FROM 句から属性名と値を取得します。

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

これは、 * を使用した別の例です。この場合、属性名は指定されていないため、Snowflakeは「COLUMN1」、「COLUMN2」などを使用します。

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

この例では、 SQL NULL と文字列「null」を使用します。

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

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)
    )
    FROM demo_table_1;
+-------------------------------------------------------------------------------+
| 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)              |
|     )                                                                         |
|-------------------------------------------------------------------------------|
| {                                                                             |
|   "created_date_seconds": 1579305600,                                         |
|   "dataset_size": 2,                                                          |
|   "distinct_province": 2,                                                     |
|   "foo": 1234567                                                              |
| }                                                                             |
| {                                                                             |
|   "created_date_seconds": 1579392000,                                         |
|   "dataset_size": 2,                                                          |
|   "distinct_province": 2,                                                     |
|   "foo": 1234567                                                              |
| }                                                                             |
+-------------------------------------------------------------------------------+
Copy