Команда SELECT
- Общее описание
- Табличный оператор JOIN
- Табличный оператор UNION
- Коррелированные подзапросы
- Оператор APPLY (боковые соединения)
- Общие табличные выражения
- Строковые функции
- LTRIM, RTRIM, LOWER, UPPER, REPLACE, CONCAT, CONCAT_WS, SUBSTRING, CHARLENGTH, DATALENGTH
- Агрегатные функции
- SUM, MAX, MIN, AVG, COUNT, STRING_AGG
- Оконные (аналитические) функции
- SUM, MAX, MIN, AVG, COUNT
- ROW_NUMBER, LAG, LEAD, FIRST_VALUE, LAST_VALUE
- Прочие полезные функции
- ISNULL, NOW, NEWUUID, IN, LIKE, BETWEEN, = ANY/ALL, EXISTS
Общее описание
Особенностью использования команды SELECT в DaJet Script является то, что результат её выполнения может быть доступен только при помощи ранее объявленной переменной. Имя этой переменной указывается в предложении INTO команды SELECT. Альтернативными вариантами являются команды DECLARE или SET, которые описаны в соответствующем разделе документации, посвящённому работе с переменными. Здесь необходимо, однако, сказать, что, при использовании команды SELECT, вариант с предложением INTO является рекомендуемым и наиболее предпочтительным.
Результатом запроса может быть скалярное значение простого типа, одна запись данных object или их набор array. Соответственно поведение команды SELECT определяется типом переменной, указанной в предложении INTO. Если это простой тип данных, то, независимо от того какой результат вернёт запрос, переменной будет присвоено значение самого первого поля самой первой записи выборки. В свою очередь, если переменная имеет тип object, то аналогичным образом будут получены значения всех полей только самой первой записи выборки. Таким образом, везде, где это целесообразно, следует использовать команду вида SELECT TOP 1. Только в случае использования переменной типа array будет получен весь набор записей, возвращаемый командой SELECT. Ну и наконец, если запрос не вернёт ни одной записи, то этой переменной будет присвоено значение NULL.
Важно также отметить, что команда SELECT возвращает весь результирующий набор записей в оперативную память среды выполнения DaJet Script. То есть не рекомендуется использование этой команды, особенно совместно с переменной типа array, если возможным результатом запроса будет большое количество данных. Что считать “большим количеством данных” очень сильно зависит от конкретных условий решаемой задачи и возможностей наличного аппаратного обеспечения. Кроме этого, следует иметь в виду, что для потоковой обработки большого количества данных предназначена команда STREAM, специально предназначенная для этого разновидность команды SELECT.
Наиболее подходящими сценариями для использования команды SELECT в DaJet Script являются запросы относительно небольших по объёму данных, например, отдельно взятых значений, настроек программы или наборов параметров для организации параллельного выполнения кода.
-- ******************************************************************************
-- * Пример команды SELECT, использующей все основные возможности синтаксиса. *
-- * Опция DISTINCT в данном случае указана только для демонстрации её наличия. *
-- ******************************************************************************
DECLARE @table array
DECLARE @company entity
USE 'mssql://server/database'
-- Запрос скалярного значения (entity)
SELECT TOP 1 Ссылка INTO @company
FROM Справочник.Организации
WHERE Код = '00-000001'
-- Запрос набора записей (array)
SELECT DISTINCT TOP 10
Номенклатура
, Количество = SUM(CASE WHEN ВидДвижения = 0
THEN Количество -- Приход
ELSE -Количество -- Расход
END)
INTO @table
FROM РегистрНакопления.ЗапасыНаСкладах
WHERE Организация = @company
GROUP BY Номенклатура
HAVING SUM(CASE WHEN ВидДвижения = 0
THEN Количество
ELSE -Количество END) > 0 -- Ненулевые остатки
ORDER BY Номенклатура
END
IF @table = NULL
THEN RETURN 'Нет данных'
ELSE RETURN @table
END
Результат выполнения запроса в DaJet Studio
| Номенклатура | Количество |
|---|---|
| {76:d0747380-7d2b-8cfd-11e5-47e1f8c9ef49} | 102.500 |
| {76:d0747380-7d2b-8cfd-11e5-47e1f8c9ef4c} | 96.400 |
| {76:d0747380-7d2b-8cfd-11e5-47e1f8c9ef5f} | 13.200 |
| {76:d0745583-7d2b-8cfd-11e4-b5b9429c26f7} | 4.000 |
| {76:d0745583-7d2b-8cfd-11e4-b5b9429c26f8} | 2.000 |
| {76:d0745583-7d2b-8cfd-11e4-b5b9429c26f9} | 10.000 |
| {76:d0745583-7d2b-8cfd-11e4-b5b9429c26fa} | 1.000 |
| {76:d0745583-7d2b-8cfd-11e4-b5b9429c26fc} | 6.000 |
| {76:d0745583-7d2b-8cfd-11e4-b5b9429c26fd} | 6.000 |
| {76:d0745583-7d2b-8cfd-11e4-b5b9429c26fe} | 6.000 |