Перейти к основному содержимому
Версия: 3.2

foreach

Описание

Команда foreach выполняет подзапросы с шаблоном для перебора следующих элементов:

  • Каждое поле, подходящее под wildcard.
  • Каждый элемент multivalue.

Синтаксис

foreach mode=(multifield | multivalue)
<wildcard-field-list> | <field>
<subsearch>

Обязательные аргументы

ПараметрСинтаксисОписание
<wildcard-field-list>[<wildcard>] [<wildcard>]*Wildcard или список wildcard, разделенных пробелом. Этот параметр доступен только в режиме multifield.
<field><field>Поле, которое будет использоваться для перебора элементов. Этот параметр доступен только в режиме multivalue.
<subsearch>[ subsearch ]Запрос SML, в котором разрешено использовать только команды where и eval. Должен быть в квадратных скобках. Запрос может содержать шаблоны, зависящие от режима работы команды.

Шаблоны для подзапроса

ШаблонЗаменяетОписание
<<FIELD>>Имя поля.multifield
<<MATCHSTR>>Часть имени поля, которая совпадает с wildcard.multifield
<<MATCHSEG1>>Часть имени поля, которая совпадает с первым wildcard.multifield
<<MATCHSEG2>>Часть имени поля, которая совпадает со вторым wildcard.multifield
<<MATCHSEG3>>Часть имени поля, которая совпадает с третьим wildcard.multifield
<<ITEM>>Элемент multivalue.multivalue

Опциональные аргументы

ПараметрСинтаксисПо умолчаниюОписание
<mode>mode=<mode-name>multifieldРежим работы foreach. Mutlifield Перебирает одно указанное имя поля или список из нескольких имен полей, которые подходят под wildcard. Multivalue перебирает значения одного multivalue поля.

Примеры запросов

Пример 1

В данном примере будут выполнены подзапросы для каждого поля, подходящего под wildcard message*. Каждый подзапрос создаст поле new <<MATCHSTR>>, где <<MATCHSTR>> будет заменено на значение, совпадающее с wildcard (Например для message1 будет создано поле new_1) и присвоит ему значение поля, для которого был вызван подзапрос.

source tweets6 
| foreach mode=multifield message* [eval new_<<MATCHSTR>> = <<FIELD>>]

Пример 2

В данном примере в поле sum будет посчитана сумма значений всех полей, подходящих под wildcard test*.

| makeresults 
| eval test1 = 100, test2 = 200, test3 =300, sum = 0
| foreach test* [eval sum = <<FIELD>> + sum]

Пример 3

В данном примере в поле sum будет посчитана сумма значений всех элементов multivalue поля test.

| makeresults 
| eval test = mvappend(100, 200, 300), sum = 0, total = 0
| foreach mode=multivalue test [eval sum = sum + <<ITEM>>, total = total + 1]

Пример 4

В данном примере останутся записи, у которых все поля, попадающие под wildcard value*, имеют значение больше 1000.

source foreach_data 
| foreach value* [where <<FIELD>> > 1000]

Пример 5

В данном примере в поле max будет посчитано максимальное значение среди элементов multivalue поля test.

| makeresults 
| eval test = mvappend(100, 200, 300, 150), max = 0
| foreach mode=multivalue test [eval max = if (max < <<ITEM>>, <<ITEM>>, max)]

Пример 6

В данном примере в каждом запросе создается поле, значение которого складывается из двух сегментов, которые равны части имени поля, попадающей под wildcard. Например, для поля t3t3t6 создастся поле new_336 со значением 36.

| makeresults 
| eval t1t1t1 = 100, t2t2t2 = 200, t3t3t6 =300
| foreach t*t*t* [eval new_<<MATCHSTR>> = <<MATCHSEG1>><<MATCHSEG3>>]