オブジェクト名の解決

完全修飾スキーマオブジェクト(テーブル、ビュー、ファイル形式など)の形式は次のとおりです。

<データベース名>.<スキーマ名>.<オブジェクト名>

ただし、この記述は手間がかかるため、ユーザーは左から右に修飾を省略できます。このトピックでは、スキーマオブジェクト名の解決方法について説明します。

データベースが省略された場合の解決

(''<スキーマ名>.<オブジェクト名>'')

オブジェクト名には現在のデータベースが追加されます。現在のデータベースは、セッション開始時にアカウントの設定に応じてデフォルト値に設定されます。その後、 USE DATABASE コマンドを使用して変更できます。CREATE DATABASE コマンドは、現在のデータベースを暗黙的に新しく作成されたデータベースに変更します。現在のデータベースの名前は CURRENT_DATABASE 関数によって返されます。

例:

SELECT CURRENT_DATABASE();
Copy
+--------------------+
| CURRENT_DATABASE() |
+--------------------+
| TESTDB             |
+--------------------+
CREATE DATABASE db1;
Copy
+------------------------------------+
|               status               |
+------------------------------------+
| Database DB1 successfully created. |
+------------------------------------+
SELECT CURRENT_DATABASE();
Copy
+--------------------+
| CURRENT_DATABASE() |
+--------------------+
| DB1                |
+--------------------+
USE DATABASE testdb;
Copy
+----------------------------------+
|              status              |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+
SELECT CURRENT_DATABASE();
Copy
+--------------------+
| 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();
Copy
+------------------+
| CURRENT_SCHEMA() |
+------------------+
| TESTSCHEMA       |
+------------------+
CREATE DATABASE db1;
Copy
+------------------------------------+
|               status               |
+------------------------------------+
| Database DB1 successfully created. |
+------------------------------------+
SELECT CURRENT_SCHEMA();
Copy
+------------------+
| CURRENT_SCHEMA() |
+------------------+
| PUBLIC           |
+------------------+
CREATE SCHEMA sch1;
Copy
+-----------------------------------+
|              status               |
+-----------------------------------+
| Schema SCH1 successfully created. |
+-----------------------------------+
SELECT current_schema();
Copy
+------------------+
| 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();
Copy
+-------------------+
| CURRENT_SCHEMAS() |
+-------------------+
| []                |
+-------------------+
USE DATABASE mytestdb;

SELECT current_schemas();
Copy
+---------------------+
| CURRENT_SCHEMAS()   |
+---------------------+
| ["MYTESTDB.PUBLIC"] |
+---------------------+
CREATE SCHEMA private;

SELECT current_schemas();
Copy
+-----------------------------------------+
| CURRENT_SCHEMAS()                       |
+-----------------------------------------+
| ["MYTESTDB.PRIVATE", "MYTESTDB.PUBLIC"] |
+-----------------------------------------+

疑似変数は現在の値に展開され、修飾されていないスキーマは完全修飾され、存在しないスキーマまたは表示されないスキーマは省略されます。

SHOW PARAMETERS LIKE 'search_path';
Copy
+-------------+--------------------+--------------------+------------------------------------------------+
| key         | value              | default            | description                                    |
+-------------+--------------------+--------------------+------------------------------------------------+
| SEARCH_PATH | $current, $public, | $current, $public, | Search path for unqualified object references. |
+-------------+--------------------+--------------------+------------------------------------------------+
SELECT current_schemas();
Copy
+---------------------------------------------------------------------------+
|                       CURRENT_SCHEMAS()                                   |
+---------------------------------------------------------------------------+
| [XY12345.TESTDB.TESTSCHEMA, XY12345.TESTDB.PUBLIC, SAMPLES.COMMON.PUBLIC] |
+---------------------------------------------------------------------------+
CREATE DATABASE db1;
Copy
+------------------------------------+
|               status               |
+------------------------------------+
| Database DB1 successfully created. |
+------------------------------------+
USE SCHEMA public;
Copy
+----------------------------------+
|              status              |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+
SELECT current_schemas();
Copy
+---------------------------------------------+
|                CURRENT_SCHEMAS()            |
+---------------------------------------------+
| [XY12345.DB1.PUBLIC, SAMPLES.COMMON.PUBLIC] |
+---------------------------------------------+
ALTER SESSION SET search_path='$current, $public, testdb.public';
Copy
+----------------------------------+
|              status              |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+
SHOW PARAMETERS LIKE 'search_path';
Copy
+-------------+----------------------------------+--------------------+------------------------------------------------+
| key         | value                            | default            | description                                    |
+-------------+----------------------------------+--------------------+------------------------------------------------+
| SEARCH_PATH | $current, $public, testdb.public | $current, $public, | Search path for unqualified object references. |
+-------------+----------------------------------+--------------------+------------------------------------------------+
SELECT current_schemas();
Copy
+---------------------------------------------+
|                CURRENT_SCHEMAS()            |
+---------------------------------------------+
| [XY12345.DB1.PUBLIC, XY12345.TESTDB.PUBLIC] |
+---------------------------------------------+

列名とエイリアスが一致する場合の優先順位

列名に一致するエイリアスを含むクエリを作成することは可能です(ただし、通常は推奨されません)。

SELECT x, some_expression AS x
  FROM ...
Copy

句に、列名とエイリアスの両方に一致する名前が含まれている場合、句は列名を使用します。次の例は、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');
Copy

次のクエリは、アクティブな従業員の給与合計と休暇中の従業員の給与合計を返します。

SELECT SUM(salary), ANY_VALUE(employment_state)
  FROM employees
  GROUP BY employment_state;
Copy
+-------------+-----------------------------+
| SUM(SALARY) | ANY_VALUE(EMPLOYMENT_STATE) |
|-------------+-----------------------------|
|      140000 | Active                      |
|       70000 | On leave                    |
+-------------+-----------------------------+

次のクエリでは、クエリ内にあるテーブルの列の名前と一致するエイリアス state を使用しています。state がGROUP BY句で使用されている場合、Snowflakeはそれをエイリアスではなく列名への参照として解釈します。したがって、このクエリは、カリフォルニア州の従業員の給与合計とオレゴン州の従業員の給与合計を返しますが、州や地区の名前ではなく employment_state の情報(つまり Active )を表示します。

SELECT SUM(salary), ANY_VALUE(employment_state) AS state
  FROM employees
  GROUP BY state;
Copy
+-------------+--------+
| SUM(SALARY) | STATE  |
|-------------+--------|
|      130000 | Active |
|       80000 | Active |
+-------------+--------+