hash Alt ←

Конструктор ::sql

Создание хеша на основе выборки из базы данных.

^hash::sql{запрос}
^hash::sql{запрос}[
	$.limit(n)
	$.offset(n)
	$.distinct(true|false)
	$.bind[variables_hash]
	$.type[hash|string|table]
]

Конструктор создает хеш, в котором имена ключей совпадают со значениями первого столбца выборки. По умолчанию каждый элемент — тоже хеш, где имена столбцов используются в качестве ключей, а соответствующие им значения — это данные столбцов.
Если же запрос возвращает только один столбец, формируется хеш, где значения столбца формируют ключи хеша, и им ставится в соответствие логическое значение «истина».

Дополнительные параметры конструктора:

Параметр Описание
$.limit(n) получить только n записей
$.offset(n) отбросить первые n записей выборки
$.bind[hash] связанные переменные, см. «Работа с IN/OUT-переменными»
$.distinct(true|false) false или 0 = считать наличие дубликата ошибкой (по умолчанию)
true или 1 = выбрать из таблицы записи с уникальным ключом
$.type[hash|string|table] [3.3.0] hash = значение каждого элемента — хеш (по умолчанию)
string = значение каждого элемента — строка, при этом нужно указать ровно два столбца в SQL-запросе
table = значение каждого элемента — таблица со всеми колонками результата

По умолчанию наличие в ключевом столбце одинаковых значений считается ошибкой. Если наличие дубликатов допустимо, следует задать опцию $.distinct(true). В этом случае в качестве данных для каждого ключа используется первая встреченная строка, последующие строки с тем же ключом игнорируются без ошибки. А если задать $.type[table], для каждого ключа формируется таблица со всеми записями, имеющими этот ключ.

Пример hash of hash

В БД содержится таблица hash_table:

pet food aggressive
cat milk very
dog bone never

Выполнение кода:

^connect[строка подключения]{
	$hash_of_hash[^hash::sql{
		SELECT
			pet,
			food,
			aggressive
		FROM
			hash_table
	}]
}

даст хеш такой структуры:

$hash_of_hash[
	$.cat[
		$.food[milk]
		$.aggressive[very]
	]
	$.dog[
		$.food[bone]
		$.aggressive[never]
	]
]

из которого можно эффективно извлекать информацию, например, так:

$animal[cat]
$animal любит $hash_of_hash.$animal.food

Пример hash of bool

В БД содержится таблица participants:

name
Константин
Александр

Выполнение кода:

^connect[строка подключения]{
	$participants[^hash::sql{
		SELECT
			name
		FROM
			participants
	}]
}

даст хеш такой структуры:

$participants[
	$.Константин(true)
	$.Александр(true)
]

из которого можно эффективно извлекать информацию, например, так:

$name[Иван]
$name ^if(!$participants.$name){не }участвует в мероприятии