Выражения, значения и выражение let

Запрос на языке формул Power Query M состоит из шагов выражения формулы, составляющих гибридный запрос. Выражение формулы можно вычислить (оценить), возвратив значение. Выражение Let инкапсулирует набор значений, которые требуется вычислить, снабдить именами, а затем использовать в последующем выражении, которое следует за оператором in. Например, выражение let может содержать переменную Source, которая равна значению Text.Proper() и возвращает текстовое значение в правильном регистре.

Выражение let

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

В приведенном выше примере ext.Proper("hello world") вычисляется как "Hello World".

В следующих разделах описаны типы значений в языке.

Значение примитива

Примитив — это однокомпонентное значение, например число, логическое значение, текст или значение NULL. Значение NULL может использоваться для указания отсутствия каких-либо данных.

Type Пример значения
Двоичные данные 00 00 00 02 // число точек (2)
Date 5/23/2015
Дата и время 5/23/2015 12:00:00 AM
DateTimeZone 5/23/2015 12:00:00 AM -08:00
Duration 15:35:00
Логические True и False
NULL null
Число 0, 1, –1, 1.5 и 2.3e-5
Текст "abc"
Время 12:34:12 PM

Значение функции

Функция — это значение, которое при вызове с аргументами создает новое значение. Функции записываются путем перечисления параметров функции в круглых скобках, за которыми следует символ перехода =>, за которым следует определяющее функцию выражение. Например, чтобы создать функцию MyFunction, которая имеет два параметра, parameter1 и parameter2, и выполняет вычисление по ним:

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

Вызов MyFunction() возвращает результат:

let
    Source = MyFunction(2, 4)
in
    Source

Этот код выдает значение 3.

Значения структурированных данных

Язык M поддерживает следующие значения структурированных данных:

Примечание

Структурированные данные могут содержать любое значение M. Несколько примеров см. в разделе Дополнительные примеры структурированных данных.

Список

Список — это отсчитываемая от нуля упорядоченная последовательность значений, заключенная в фигурные скобки { }. Фигурные скобки { } также используются для получения элемента из списка по позиции индекса. См. раздел [Значение списка](#_List_value).

Примечание

Power Query M поддерживает неограниченный размер списка, но если список записывается как литерал, он имеет фиксированную длину. Например, {1, 2, 3} имеет фиксированную длину, равную 3.

Ниже приведены некоторые примеры списков.

Значение Type
{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}
Возвращение значения второго элемента из первого элемента списка. Это выражение возвращает значение 2.

Record

Запись представляет собой набор полей. Поле — это пара "имя-значение", где имя является текстовым значением, уникальным в пределах записи поля. Синтаксис значений записи позволяет записывать имена без кавычек, в такой форме они также называются идентификаторами. Идентификатор может принимать две следующие формы:

  • Имя_идентификатора, например OrderID.

  • #"имя идентификатора", например, #"Сегодняшняя дата: ".

Ниже приведена запись, содержащая поля "OrderID", "CustomerID", "Item" и "Price" со значениями 1, 1, "Fishing rod" и 100,00. Квадратные скобки [] обозначают начало и конец выражения записи и используются для получения значения поля из записи. В следующих примерах показана запись и получение значения поля "Item".

Ниже приведен пример записи:

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

Чтобы получить значение поля "Item", используйте квадратные скобки в формате 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
Элемент Черви, 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

Наглядно вычисление этого выражения можно представить следующим образом:

Пример списка 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

Наглядно вычисление этого выражения можно представить следующим образом:

Пример списка 2

Примечание

Хотя многие значения могут быть записаны буквально в виде выражения, значение не является выражением. Например, вычисление выражения 1 дает значение 1, а вычисление выражения 1+1 дает значение 2. Это неочевидное, но важное различие. Выражения являются наборами правил для вычисления, а значения — результатами вычисления.

Выражение if

Выражение if осуществляет выбор между двумя выражениями на основе логического условия. Пример:

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

Первое выражение (2 + 2) выбирается, если логическое выражение (2 > 1) истинно, а второе выражение (1 + 1) выбирается, если оно ложно. Выбранное выражение (в данном случае 2 + 2) вычисляется и становится результатом выражения if (4).