式、値、および let 式

Power Query の M 式言語のクエリは、マッシュアップ クエリを作成するの手順で構成されています。 式は評価 (計算) されて、値を生成することができます。 let 式には、計算され、名前を割り当てられた後、in ステートメントに続く後の式で使用される、一連の値がカプセル化されています。 たとえば、let 式には、Text.Proper() の値と等しく、適切な大文字と小文字のテキスト値を生成する、Source 変数を含めることができます。

Let 式

let
    Source = Text.Proper("hello world")
in
    Source

上記の例では、Text.Proper("hello world") は "Hello World" と評価されます。

次のセクションでは、言語での値の型について説明します。

プリミティブ値

プリミティブ 値は、数値、論理、テキスト、null などの単一要素の値です。 null 値を使用すると、どのようなデータも存在しないことを示すことができます。

種類 値の例
2 項 00 00 00 02 // ポイントの数 (2)
Date 5/23/2015
DateTime 5/23/2015 12:00:00 AM
DateTimeZone 5/23/2015 12:00:00 AM -08:00
期間 15:35:00
論理 true および false
[Null] null
数値 0、1、-1、1.5、2.3e-5
テキスト "abc"
時刻 12:34:12 PM

関数の値

関数は、引数を指定して呼び出されると新しい値を生成する値です。 関数は、かっこで囲まれた関数のパラメーター、移動記号 =>、関数を定義する式を、この順序で列記することによって記述します。 たとえば、2 つのパラメーターを持ち、parameter1 と parameter2 に対して計算を実行する、"MyFunction" という名前の関数を作成するには、次のようにします。

let
    MyFunction = (parameter1, parameter2) => (parameter1 + parameter2) / 2
in
    MyFunction

MyFunction() を呼び出すと、次の結果が返されます。

let
    Source = MyFunction(2, 4)
in
    Source

このコードでは、値 3 が生成されます。

構造化データ値

M 言語では、次の構造化データ値がサポートされています。

注意

構造化データには、任意の M 値を格納できます。 例を見るには、「その他の構造化データの例」を参照してください。

List

リストは、中かっこ {} で囲まれた、0 から始まる順序付けされた値のシーケンスです。 中かっこ文字 {} は、インデックス位置によってリストから項目を取得するためにも使用されます。 「[リストの値](#_List_value)」を参照してください。

注意

Power Query の M では、無限リスト サイズがサポートされていますが、リストをリテラルとして記述する場合は、リストの長さは固定されています。 たとえば、{1, 2, 3} は固定長 3 です。

リストの例を次に示します。

[値] 種類
{123, true, "A"} 数値、論理値、およびテキストを含むリスト。
{1, 2, 3} 数値のリスト
{
    {1, 2, 3},
    {4, 5, 6}
}
数値のリストのリスト
{
    [CustomerID = 1, Name = "Bob", Phone = "123-4567"],
    [CustomerID = 2, Name = "Jim", Phone = "987-6543"]
}
レコードのリスト
{123, true, "A"}{0} リスト内の最初の項目の値を取得します。 この式では、値 123 が返されます。
{
    {1, 2, 3},
    {4, 5, 6}
}{0}{1}
1 番目のリスト要素から 2 番目の項目の値を取得します。 この式では、値 2 が返されます。

Record

レコードは、フィールドのセットです。 フィールドは、名前と値のペアであり、名前はフィールドのレコード内で一意のテキスト値です。 レコード値の構文では、引用符なしで名前を記述できます。識別子とも呼ばれる形式です。 識別子は、次の 2 つの形式をとることができます。

  • identifier_name (OrderID など)。

  • #"識別子名" (#"今日のデータ: " など)。

次のレコードには、"OrderID"、"CustomerID"、"Item"、"Price" という名前のフィールドが含まれ、値は 1、1、"Fishing rod"、100.00 です。 角かっこ [] は、レコード式の開始と終了を示し、レコードからフィールド値を取得するために使用されます。 次の例では、レコードと、項目フィールドの値を取得する方法を示します。

例のレコードは次のとおりです。

let Source =
        [
              OrderID = 1,
              CustomerID = 1,
              Item = "Fishing rod",
              Price = 100.00
        ]
in Source

項目の値を取得するには、Source[Item] のように角かっこを使用します。

let Source =
    [
          OrderID = 1,
          CustomerID = 1,
          Item = "Fishing rod",
          Price = 100.00
    ]
in Source[Item] //equals "Fishing rod"

テーブル

テーブルは、名前付きの列と行に編成された値のセットです。 列の型は、暗黙的または明示的に指定できます。 #table を使用すると、列名のリストと行のリストを作成できます。 値のテーブルは、リスト内のリストです。 中かっこ文字 { } は、インデックス位置を指定してテーブルから行を取得するためにも使用されます (「例 3 – インデックス位置でテーブルから行を取得する」を参照)。

例 1 - 暗黙的な列の型でテーブルを作成する

let
  Source = #table(
    {"OrderID", "CustomerID", "Item", "Price"},
      {
          {1, 1, "Fishing rod", 100.00},
          {2, 1, "1 lb. worms", 5.00}
      })
in
    Source

例 2 - 明示的な列の型でテーブルを作成する

let
    Source = #table(
    type table [OrderID = number, CustomerID = number, Item = text, Price = number],
        {
                {1, 1, "Fishing rod", 100.00},
             {2, 1, "1 lb. worms", 5.00}
        }
    )
in
    Source

上のどちらの例でも、次の形状のテーブルが作成されます。

OrderID CustomerID アイテム 価格
1 1 釣り竿 100.00
2 1 虫えさ 1 ポンド 5.00

例 3 – インデックス位置でテーブルから行を取得する

let
    Source = #table(
    type table [OrderID = number, CustomerID = number, Item = text, Price = number],
        {
              {1, 1, "Fishing rod", 100.00},
              {2, 1, "1 lb. worms", 5.00}
         }
    )
in
    Source{1}

この式では、次のレコードが返されます。

フィールド
OrderID 2
CustomerID 1
Item 虫えさ 1 ポンド
価格 5

その他の構造化データの例

構造化データには、任意の M 値を格納できます。 次に例をいくつか示します。

例 1 - [Primitive](#_Primitive_value_1) 値、[Function](#_Function_value)、[Record](#_Record_value) のリスト

let
    Source =
{
   1,
   "Bob",
   DateTime.ToText(DateTime.LocalNow(), "yyyy-MM-dd"),
   [OrderID = 1, CustomerID = 1, Item = "Fishing rod", Price = 100.0]
}
in
    Source

この式の評価は次のように視覚化できます。

List Example 1

例 2 - プリミティブ値と入れ子になったレコードを含むレコード

let
    Source = [CustomerID = 1, Name = "Bob", Phone = "123-4567", Orders =
        {
              [OrderID = 1, CustomerID = 1, Item = "Fishing rod", Price = 100.0],
            [OrderID = 2, CustomerID = 1, Item = "1 lb. worms", Price = 5.0]
        }]
in
    Source

この式の評価は次のように視覚化できます。

List Example 2

Note

多くの値は式としてリテラルに記述できますが、値は式ではありません。 たとえば、式 1 は値 1 として評価され、式 1 + 1 は値 2 として評価されます。 この区別は微妙ですが、重要です。 式は評価のレシピです。値は評価の結果です。

If 式

if 式は、論理条件に基づいて 2 つの式のどちらかを選択します。 次に例を示します。

if 2 > 1 then
    2 + 2
else
    1 + 1

論理式 (2 > 1) が true の場合は最初の式 (2 + 2) が選択され、false の場合は 2 番目の式 (1 + 1) が選択されます。 選択された式 (この場合は 2 + 2) が評価され、if 式の結果になります (4)。