例: 曖昧なJSONドット表記法 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - JSONデータ型

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年9月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/gzn1554761068186.ditamap
dita:ditavalPath
ja-JP/gzn1554761068186.ditaval
dita:id
evi1472243742653
Product Category
Software
Teradata Vantage

次のクエリーでは、T.jsonColT.idは列参照として解釈されます。
SELECT T.id, T.jsonCol
FROM test.jsonTable T
WHERE id < 3
ORDER BY 1;
結果:
id     jsonCol
--------------
1      {"name" : "Cameron", "numbers" : [1,2,3,[1,2]]}
2      {"name" : "Cameron", "name" : "Lewis"}

次のクエリーでは、jsonCol.nameはJSONドット表記法として解釈されます。
SELECT id, jsonCol.name
FROM test.jsonTable
WHERE id=1;
結果:
id     jsonCol.name
-------------------
1      Cameron

次のクエリーではエラーが返されます。これは、jsonColという名前のJSON列に複数のソース テーブルがあるためです。
SELECT jsonCol.name
FROM test.jsonTable, test.jsonTable2;
結果:
*** Failure 3809 Column 'jsonCol' is ambiguous.

次のクエリーは、完全修飾列参照として指定されたJSONドット表記法参照を示しています。
SELECT id, test.jsonTable.jsonCol.name
FROM test.jsonTable
WHERE id=1;
結果:
id     jsonTable.jsonCol.name
----------------------------------
1      Cameron

次に、完全修飾列参照として指定された間違ったJSONドット表記法を示します。
SELECT test.jsonTable.id.name
FROM test.jsonTable
WHERE id=1;
クエリーはエラーを返します。
*** Failure 3706 Syntax error: Invalid use of JSON entity reference syntax on non-JSON type.

次のクエリーでは、jsonTable.jsonCol.namedatabase.table.column参照のような外観のJSONドット表記法参照です。
SELECT id, jsonTable.jsonCol.name
FROM test.jsonTable
WHERE id=1;
結果:
id     jsonTable.jsonCol.name
-----------------------------
1      Cameron

JSONドット表記法参照が正しくありません

SELECT jsonTable.id.name
FROM test.jsonTable
WHERE id=1;
結果:
*** Failure 3802 Database 'jsonTable' does not exist.

次のクエリーでは、jsonCol.name."first"はソース テーブルtest.jsonTablejsonCol列でドット表記法参照として解釈されます。
SELECT T.id, jsonCol.name."first"
FROM test.jsonTable T, test.jsonTable3 T3
ORDER BY T.id;
結果:
id     jsonCol.name.first
-------------------------
1      ?
2      ?
3      Cameron

次のクエリーでは、jsonColへの参照が曖昧です。これは、両方のソース テーブルにjsonColという名前のJSON列が含まれるからです。
SELECT T.id, jsonCol.name."first"
FROM test.jsonTable T, test.jsonTable2 T2
ORDER BY T.id;
クエリーはエラーを返します。
*** Failure 3809 Column 'jsonCol' is ambiguous.

この例では、jsonTable2は現在のデータベースにありjsonColと呼ばれるJSON列をともなうので、jsonTable2.jsonCol.nameはJSONドット表記法として解釈されます。
SELECT jsonTable2.id, jsonTable2.jsonCol.name
FROM test.jsonTable3;
結果:
id     jsonCol.name
------------------------------
1      Cameron