式 (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric Warehouse Microsoft Fabric SQL Database
単一のデータ値を取得するために SQL Server データベース エンジン評価されるシンボルと演算子の組み合わせ。 単純式には、1 つの定数、変数、列、またはスカラー関数を指定できます。 演算子を使用すると、2 つ以上の単純式を結合して、複合式を作成できます。
構文
SQL Server および Azure SQL データベース の構文
{ constant | scalar_function | [ table_name. ] column | variable
| ( expression ) | ( scalar_subquery )
| { unary_operator } expression
| expression { binary_operator } expression
| ranking_windowed_function | aggregate_windowed_function
}
Azure Synapse Analytics と Parallel Data Warehouse の構文。
-- Expression in a SELECT statement
<expression> ::=
{
constant
| scalar_function
| column
| variable
| ( expression )
| { unary_operator } expression
| expression { binary_operator } expression
}
[ COLLATE Windows_collation_name ]
-- Scalar Expression in a DECLARE , SET , IF...ELSE , or WHILE statement
<scalar_expression> ::=
{
constant
| scalar_function
| variable
| ( expression )
| (scalar_subquery )
| { unary_operator } expression
| expression { binary_operator } expression
}
[ COLLATE [ Windows_collation_name ] ]
引数
constant
1 つの特定のデータ値を表すシンボル。 詳細については、「定数」を参照してください。
scalar_function
特定のサービスを提供し、1 つの値を返す Transact-SQL 構文の単位。 scalar_function には、 SUM
、 GETDATE()
、 CAST
関数、スカラー ユーザー定義関数などのスカラー関数を組み込むことができます。
table_name
テーブルの名前またはエイリアス。
column
列の名前。 式では列の名前だけが許可されます。
variable
変数またはパラメーターの名前。 詳細については、DECLARE @local_variableを参照してください。
式 (expression)
この記事で定義されている任意の有効な式。 かっこはグループ化の演算子です。かっこ内の式のすべての演算子は最初に評価され、その後で結果の式が別の式と結合されます。
scalar_subquery
1 つの値を返すサブクエリ。 次に例を示します。
SELECT MAX(UnitPrice)
FROM Products;
unary_operator
単項演算子を適用できるのは、数値型に属するいずれかのデータ型に評価される式だけです。 1 つの数値オペランドだけを含む演算子を指定します。
+
は正の数を示します-
は負の数を示します~
は、1 の補数演算子を示します
binary_operator
2 つの式を結合して 1 つの結果を生成する方法を定義する演算子。 binary_operator 算術演算子、代入演算子 (=
)、ビット演算子、比較演算子、論理演算子、文字列連結演算子 (+
)、単項演算子を指定できます。 演算子の詳細については、「 Operators」を参照してください。
ranking_windowed_function
Transact-SQL ランク付け関数。 詳細については、「 Ranking Functions」を参照してください。
aggregate_windowed_function
OVER 句を含む Transact-SQL 集計関数。 詳細については、 SELECT - OVER 句を参照してください。
式の結果
1 つの定数、変数、スカラー関数、または列名で構成される単純式の場合、式のデータ型、照合順序、有効桁数、小数点以下桁数、および値は、参照される要素のデータ型、照合順序、有効桁数、小数点以下桁数、および値になります。
比較演算子または論理演算子を使用して 2 つの式を組み合わせると、結果のデータ型は Boolean になり、値は TRUE
、 FALSE
、または UNKNOWN
のいずれかになります。 ブール型の詳細については、「 Comparison 演算子」を参照してください。
2 つの式が、算術演算子、ビットごとの演算子、または文字列演算子で結合される場合、取得される結果のデータ型は演算子によって決まります。
複数の記号と演算子で構成される複合式は、単一の値をとる結果に評価されます。 結果の式のデータ型、照合順序、有効桁数、および値は、構成要素の式を一度に 2 つずつ結合して取得される最終結果によって決まります。 式の結合順序は、式の中の演算子の優先順位で定義されます。
解説
2 つの式が演算子でサポートされているデータ型を持ち、これらの条件のうち少なくとも 1 つが true の場合、2 つの式を 1 つの演算子で結合できます。
式のデータ型が等しい。
優先順位の低いデータ型を、優先順位の高いデータ型に暗黙的に変換できる。
式がこれらの条件を満たしていない場合は、 CAST
または CONVERT
関数を使用できます。 CAST
またはCONVERT
を使用して、優先順位の低いデータ型を、優先順位の高いデータ型に明示的に変換するか、優先順位の高いデータ型に暗黙的に変換できる中間データ型に変換します。
サポートされている暗黙的または明示的な変換がない場合、2 つの式を組み合わせることはできません。
文字列として評価される式の照合順序は、照合順序の優先順位の規則に従って設定されます。 詳細については、「照合順序の優先順位」を参照してください。
C や Microsoft Visual Basic などのプログラミング言語の場合、式は常に単一の結果に評価されます。 Transact-SQL 選択リスト内の式の場合は、この規則の限りではありません。式は、結果セット内の各行に対して個別に評価されます。 1 つの式は結果セットの各行で異なる値を持つことができますが、各行には式の値が 1 つだけあります。 たとえば、次の SELECT
ステートメントにおいて、選択リスト内の ProductID
への参照と 1+2
の項は両方とも式です。
USE AdventureWorks2022;
GO
SELECT ProductID, 1 + 2
FROM Production.Product;
GO
式 1+2
は、結果セット内の各行で 3
と評価されます。 式 ProductID
は、結果セットの各行で一意な値をとりますが、各行に格納される ProductID
の値は 1 つだけです。
- Azure Synapse Analytics によって各スレッドに固定された最大メモリ量が割り当てられるため、スレッドによってすべてのメモリが使い尽くされることはありません。 このメモリの一部は、クエリの式を格納するために使用されます。 クエリに含まれる式が多すぎて、必要なメモリが内部制限を超えている場合、エンジンは式を実行しません。 この問題を回避するために、ユーザーはクエリを複数のクエリに変更して、それぞれのクエリに含まれる式の数を減らすことができます。 たとえば、次のように WHERE 句に式の長いリストを含むクエリがあるとします。
DELETE
FROM dbo.MyTable
WHERE (c1 = '0000001' AND c2 = 'A000001')
OR (c1 = '0000002' AND c2 = 'A000002')
OR (c1 = '0000003' AND c2 = 'A000003')
/* ... additional, similar expressions omitted for simplicity */
このクエリは次のように変更します。
DELETE FROM dbo.MyTable WHERE (c1 = '0000001' AND c2 = 'A000001');
DELETE FROM dbo.MyTable WHERE (c1 = '0000002' AND c2 = 'A000002');
DELETE FROM dbo.MyTable WHERE (c1 = '0000003' AND c2 = 'A000003');
/* ... refactored, individual DELETE statements omitted for simplicity */