オブジェクト名の解決¶
完全修飾スキーマオブジェクト(テーブル、ビュー、ファイル形式など)の形式は次のとおりです。
<データベース名>.<スキーマ名>.<オブジェクト名>
ただし、この記述は手間がかかるため、ユーザーは左から右に修飾を省略できます。このトピックでは、スキーマオブジェクト名の解決方法について説明します。
データベースが省略された場合の解決¶
(''<スキーマ名>.<オブジェクト名>'')
オブジェクト名には現在のデータベースが追加されます。現在のデータベースは、セッション開始時にアカウントの設定に応じてデフォルト値に設定されます。その後、 USE DATABASE コマンドを使用して変更できます。CREATE DATABASE コマンドは、現在のデータベースを暗黙的に新しく作成されたデータベースに変更します。現在のデータベースの名前は CURRENT_DATABASE 関数によって返されます。
例:
SELECT CURRENT_DATABASE();
+--------------------+
| CURRENT_DATABASE() |
+--------------------+
| TESTDB |
+--------------------+
CREATE DATABASE db1;
+------------------------------------+
| status |
+------------------------------------+
| Database DB1 successfully created. |
+------------------------------------+
SELECT CURRENT_DATABASE();
+--------------------+
| CURRENT_DATABASE() |
+--------------------+
| DB1 |
+--------------------+
USE DATABASE testdb;
+----------------------------------+
| status |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+
SELECT CURRENT_DATABASE();
+--------------------+
| CURRENT_DATABASE() |
+--------------------+
| TESTDB |
+--------------------+
スキーマが省略された場合の解決(ダブルドット表記)¶
(''<データベース名>..<オブジェクト名>'')
2つのドットは、スキーマ名が指定されていないことを示します。PUBLIC デフォルトスキーマは常に参照されます。
この表記形式は主に、Microsoft SQL Serverや IBM Netezzaなどの他のシステムとの互換性のために提供されています。新しいクエリでこの表記を使用することは推奨しません。
修飾されていないオブジェクト¶
修飾されていないオブジェクト(単一の識別子)は、 DDL または DML ステートメントに現れるか、クエリに現れるかに応じて、2つの異なる方法で解決されます。
DDL および DML ステートメント¶
DDL および DML ステートメントでは、修飾されていないオブジェクトに現在のデータベースとスキーマが追加されます。現在のスキーマは、現在のデータベースと同様に維持されます。現在のスキーマは常に現在のデータベースに属します。
セッションが開始されると、現在のスキーマは接続の設定に基づいて初期化されます。現在のデータベースが変更されると、現在のスキーマはデフォルトで内部プロパティの値になります(通常は PUBLICに設定)。USE SCHEMA コマンドを使用して、現在のスキーマを(常に現在のデータベース内で)変更できます。また、 CREATE SCHEMA コマンドによって暗黙的に変更されます。現在のスキーマの名前は CURRENT_SCHEMA 関数によって返されます。
例:
SELECT CURRENT_SCHEMA();
+------------------+
| CURRENT_SCHEMA() |
+------------------+
| TESTSCHEMA |
+------------------+
CREATE DATABASE db1;
+------------------------------------+
| status |
+------------------------------------+
| Database DB1 successfully created. |
+------------------------------------+
SELECT CURRENT_SCHEMA();
+------------------+
| CURRENT_SCHEMA() |
+------------------+
| PUBLIC |
+------------------+
CREATE SCHEMA sch1;
+-----------------------------------+
| status |
+-----------------------------------+
| Schema SCH1 successfully created. |
+-----------------------------------+
SELECT current_schema();
+------------------+
| CURRENT_SCHEMA() |
|------------------+
| SCH1 |
|------------------+
クエリにおける名前解決¶
クエリでは、修飾されていないオブジェクト名は検索パスを介して解決されます。
通常、検索パスには現在のスキーマが含まれますが、他のスキーマを含めることもできます。
検索パスは、セッションレベルのパラメーター SEARCH_PATHに保存されます。他のパラメーターと同様に、 ALTER SESSION コマンドを使用して変更できます。
検索パスの値は、識別子のコンマ区切りリストです。リストには、完全修飾または部分修飾のスキーマ名を含めることができます。各スキーマ名は、 二重引用符で囲まれた識別子 にできます。
検索パスには、次の擬似変数を含めることもできます。
- $current
現在のスキーマを指定します(上記を参照)。
- $public
現在のデータベースのパブリックスキーマを指定します。パブリックスキーマの名前は、Snowflakeが管理する内部プロパティによって決定され、通常は PUBLIC に設定されます(各データベースに対して自動的に作成される PUBLIC スキーマの場合)。
これらの擬似変数名は大文字と小文字を区別しません。
検索パスのデフォルト値は $current, $public です。
ユーザーが検索パスに新しい値を指定すると、新しい値が検証されます。新しい値で指定されるすべてのスキーマ識別子は、既存のスキーマに対応する必要があります。(特に、すべての非修飾スキーマは、現在のデータベースの既存のスキーマに対応する必要があります)。そうでない場合はエラーが発生し、search_pathは以前の値を保持します。ただし、疑似変数は自由に使用できます。たとえば、現在のデータベースにパブリックスキーマがない場合でも、 $public を使用できます。
SEARCH_PATH パラメーターの値は、使用のたびに再解釈されます。したがって、現在のスキーマを変更すると $current の意味が変更され、現在のデータベースを変更すると $public の意味、および非修飾スキーマの意味が変更されます。
検索パスのスキーマがドロップされた場合、または現在のデータベースが変更されて検索パスの一部の非修飾スキーマが新しいデータベースに存在しない場合、エラーは発生しません。
SEARCH_PATH は ビュー または UDFs 内では使用されません。ビューまたは UDF 定義のすべての非修飾オブジェクトは、ビューまたは UDF のスキーマ のみ で解決されます。
検索パスのリテラル値は、コマンド SHOW PARAMETERS を使用して調べることができます。
クエリで非修飾オブジェクトを検索するスキーマを表示するには、 CURRENT_SCHEMAS 関数を使用します。関数の戻り値には、検索パスにコンマで区切られた一連の完全修飾スキーマが含まれます。
例:
SELECT CURRENT_SCHEMAS();
+-------------------+
| CURRENT_SCHEMAS() |
+-------------------+
| [] |
+-------------------+
USE DATABASE mytestdb;
SELECT current_schemas();
+---------------------+
| CURRENT_SCHEMAS() |
+---------------------+
| ["MYTESTDB.PUBLIC"] |
+---------------------+
CREATE SCHEMA private;
SELECT current_schemas();
+-----------------------------------------+
| CURRENT_SCHEMAS() |
+-----------------------------------------+
| ["MYTESTDB.PRIVATE", "MYTESTDB.PUBLIC"] |
+-----------------------------------------+
疑似変数は現在の値に展開され、修飾されていないスキーマは完全修飾され、存在しないスキーマまたは表示されないスキーマは省略されます。
SHOW PARAMETERS LIKE 'search_path';
+-------------+--------------------+--------------------+------------------------------------------------+
| key | value | default | description |
+-------------+--------------------+--------------------+------------------------------------------------+
| SEARCH_PATH | $current, $public, | $current, $public, | Search path for unqualified object references. |
+-------------+--------------------+--------------------+------------------------------------------------+
SELECT current_schemas();
+---------------------------------------------------------------------------+
| CURRENT_SCHEMAS() |
+---------------------------------------------------------------------------+
| [XY12345.TESTDB.TESTSCHEMA, XY12345.TESTDB.PUBLIC, SAMPLES.COMMON.PUBLIC] |
+---------------------------------------------------------------------------+
CREATE DATABASE db1;
+------------------------------------+
| status |
+------------------------------------+
| Database DB1 successfully created. |
+------------------------------------+
USE SCHEMA public;
+----------------------------------+
| status |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+
SELECT current_schemas();
+---------------------------------------------+
| CURRENT_SCHEMAS() |
+---------------------------------------------+
| [XY12345.DB1.PUBLIC, SAMPLES.COMMON.PUBLIC] |
+---------------------------------------------+
ALTER SESSION SET search_path='$current, $public, testdb.public';
+----------------------------------+
| status |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+
SHOW PARAMETERS LIKE 'search_path';
+-------------+----------------------------------+--------------------+------------------------------------------------+
| key | value | default | description |
+-------------+----------------------------------+--------------------+------------------------------------------------+
| SEARCH_PATH | $current, $public, testdb.public | $current, $public, | Search path for unqualified object references. |
+-------------+----------------------------------+--------------------+------------------------------------------------+
SELECT current_schemas();
+---------------------------------------------+
| CURRENT_SCHEMAS() |
+---------------------------------------------+
| [XY12345.DB1.PUBLIC, XY12345.TESTDB.PUBLIC] |
+---------------------------------------------+
列名とエイリアスが一致する場合の優先順位¶
列名に一致するエイリアスを含むクエリを作成することは可能です(ただし、通常は推奨されません)。
SELECT x, some_expression AS x
FROM ...
句に、列名とエイリアスの両方に一致する名前が含まれている場合、句は列名を使用します。次の例は、GROUP BY句を使用したこの動作を示しています。
テーブルを作成して行を挿入します。
CREATE TABLE employees (salary FLOAT, state VARCHAR, employment_state VARCHAR);
INSERT INTO employees (salary, state, employment_state) VALUES
(60000, 'California', 'Active'),
(70000, 'California', 'On leave'),
(80000, 'Oregon', 'Active');
次のクエリは、アクティブな従業員の給与合計と休暇中の従業員の給与合計を返します。
SELECT SUM(salary), ANY_VALUE(employment_state)
FROM employees
GROUP BY employment_state;
+-------------+-----------------------------+
| SUM(SALARY) | ANY_VALUE(EMPLOYMENT_STATE) |
|-------------+-----------------------------|
| 140000 | Active |
| 70000 | On leave |
+-------------+-----------------------------+
The next query uses the alias state, which matches the name of a column of the table in the query. When state is used in
the GROUP BY clause, Snowflake interprets it as a reference to the column name, not the alias. This query therefore returns the sum of
the salaries of the employees in the state of California and the sum of the salaries of the employees in the state of Oregon,
yet displays employment_state information, such as Active, rather than the names of states or provinces:
SELECT SUM(salary), ANY_VALUE(employment_state) AS state
FROM employees
GROUP BY state;
+-------------+--------+
| SUM(SALARY) | STATE |
|-------------+--------|
| 130000 | Active |
| 80000 | Active |
+-------------+--------+