Примеры использования выражения case в transact-sql

Функции CASE и IIF

Последнее обновление: 29.07.2017

CASE

Функция CASE проверяет значение некоторого выражение, и в зависимости от результата проверки может возвращать тот или иной результат.

CASE принимает следующую форму:

CASE выражение
	WHEN значение_1 THEN результат_1
	WHEN значение_2 THEN результат_2
	.................................
	WHEN значение_N THEN результат_N
	
END

Возьмем для примера следующую таблицу Products:

CREATE TABLE Products
(
    Id INT IDENTITY PRIMARY KEY,
    ProductName NVARCHAR(30) NOT NULL,
    Manufacturer NVARCHAR(20) NOT NULL,
    ProductCount INT DEFAULT 0,
    Price MONEY NOT NULL
);

Выполним запрос к этой таблице и используем функцию CASE:

SELECT ProductName, Manufacturer,
	CASE ProductCount
		WHEN 1 THEN 'Товар заканчивается'
		WHEN 2 THEN 'Мало товара'
		WHEN 3 THEN 'Есть в наличии'
		ELSE 'Много товара'
	END AS EvaluateCount
FROM Products

Здесь значения столбца ProductCount последовательно сравнивается со значениями после операторов WHEN. В
зависимости от значения столбца ProductCount функция CASE будет возвращать одну из строк, которая идет после соответствующего оператора THEN.
Для возвращаемого результата определен столбец EvaluateCount:

Также функция CASE может принимать еще одну форму:

CASE
	WHEN выражение_1 THEN результат_1
	WHEN выражение_2 THEN результат_2
	.................................
	WHEN выражение_N THEN результат_N
	
END

Например, применительно к таблице Products:

SELECT ProductName, Manufacturer,
	CASE
		WHEN Price > 50000 THEN 'Категория A'
		WHEN Price BETWEEN 40000 AND 50000 THEN 'Категория B'
		WHEN Price BETWEEN 30000 AND 40000 THEN 'Категория C'
		ELSE 'Категория D'
	END AS Category
FROM Products

Фактически все то же самое, что и в предыдущем примере, только после CASE не указывается сравниваемое значение.
А сами выражения сравнения стоят после оператора WHEN. И если выражение после оператора WHEN будет истинно, то возвращается значение, которое идет после соответствующего оператора THEN.

IIF

Функция IIF в зависимости от результата условного выражения возвращает одно из двух значений. Общая форма функции выглядит следующим образом:

IIF(условие, значение_1, значение_2)

Если условие в функции IIF истинно то возвращается значение_1, если ложно, то возвращается значение_2. Например:

SELECT ProductName, Manufacturer,
	IIF(ProductCount>3, 'Много товара', 'Мало товара')
FROM Products

НазадВперед

Синтаксис

Синтаксис оператора CASE в SQL Server (Transact-SQL):

CASE expression

WHEN value_1 THEN result_1
WHEN value_2 THEN result_2

WHEN value_n THEN result_n

ELSE result

END

ИЛИ

CASE

WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2

WHEN condition_n THEN result_n

ELSE result

END

Параметры или аргументы

expression — выражение, которое будет сравниваться с каждым из предоставленных значений. (то есть: value_1, value_2, … value_n).value_1, value_2, … value_n — значения, которые будут сравниваться. Значения сравниваются в указанном порядке. Когда value соответствует expression, оператор CASE выполнит указанные команды и не будет дальше сравнивать value.condition_1, condition_2, … condition_n — условия, которые будут сравниваться. Условия сравниваются в указанном порядке. Как только условие окажется истинным, оператор CASE вернет результат и не будет сравнивать условия дальше. Все условия должны быть одного и того же типа.result_1, result_2, … result_n – возвращаемые значение после того, как условие установлено как true. Все значения должны быть одного типа данных.

Создание или открытие файла SQL

Чтобы выполнять команды mssql и пользоваться технологией IntelliSense для T-SQL в редакторе кода, необходимо выбрать языковой режим SQL.

  1. Выберите пункт Файл > Создать файл или нажмите клавиши CTRL+N. По умолчанию в Visual Studio Code открывается обычный текстовый файл.

  2. В нижней строке состояния выберите Обычный текст или нажмите клавиши CTRL+K > M, а затем выберите в раскрывающемся списке языков пункт SQL.

    Примечание

    Если вы используете расширение впервые, оно установит службу инструментов SQL в фоновом режиме.

При открытии существующего файла с расширением .sql языковой режим SQL устанавливается автоматически.

Пример

Рассмотрим некоторые примеры SQL Server оператора CASE, чтобы понять, как использовать оператор CASE в SQL Server (Transact-SQL). Например:

Transact-SQL

SELECT shop_id,
CASE market_id
WHEN 1 THEN ‘IKEA’
WHEN 2 THEN ‘METRO’
ELSE ‘EMAG’
END
FROM markets;

1
2
3
4
5
6
7

SELECTshop_id,

CASEmarket_id

WHEN1THEN’IKEA’

WHEN2THEN’METRO’

ELSE’EMAG’

END

FROMmarkets;

Или вы можете написать SQL-предложение с помощью оператора CASE следующим образом: (исключая выражение)

Transact-SQL

SELECT shop_id,
CASE
WHEN market_id = 1 THEN ‘IKEA’
WHEN market_id = 2 THEN ‘METRO’
ELSE ‘EMAG’
END
FROM markets;

1
2
3
4
5
6
7

SELECTshop_id,

CASE

WHENmarket_id=1THEN’IKEA’

WHENmarket_id=2THEN’METRO’

ELSE’EMAG’

END

FROMmarkets;

Следует отметить, что условие ELSE в операторе CASE является необязательным. Его можно было бы опустить. Давайте изменим наши примеры, если условие ELSE опущено.

Ваш оператор SQL будет выглядеть следующим образом:

Transact-SQL

SELECT shop_id,
CASE market_id
WHEN 1 THEN ‘IKEA’
WHEN 2 THEN ‘METRO’
END
FROM markets;

1
2
3
4
5
6

SELECTshop_id,

CASEmarket_id

WHEN1THEN’IKEA’

WHEN2THEN’METRO’

END

FROMmarkets;

ИЛИ

Transact-SQL

SELECT shop_id,
CASE
WHEN market_id = 1 THEN ‘IKEA’
WHEN market_id = 2 THEN ‘METRO’
END
FROM markets;

1
2
3
4
5
6

SELECTshop_id,

CASE

WHENmarket_id=1THEN’IKEA’

WHENmarket_id=2THEN’METRO’

END

FROMmarkets;

Если опущено ELSE, и если условие не было определено как true, оператор CASE возвращает NULL.

Аргументы

Термин Определение
constant Символ, представляющий одно конкретное значение данных. Дополнительные сведения см. в статье Константы (Transact-SQL).
scalar_function Единица синтаксиса Transact-SQL, который предоставляет определенную службу и возвращает одиночное значение. scalar_function может быть встроенной скалярной функцией, такой как SUM, GETDATE или CAST, либо определяемыми пользователем скалярными функциями.
Имя или псевдоним таблицы.
column Имя столбца. Только имя столбца используется в выражении.
variable Имя переменной или параметр. Дополнительные сведения см. в статье DECLARE @local_variable (Transact-SQL).
( expression ) Любое допустимое выражение из определенных в этом разделе. Скобки являются операторами группировки, гарантирующими, что все операторы выражения внутри скобок будут выполнены, прежде чем результирующее выражение будет объединено с другим.
( scalar_subquery ) Вложенный запрос, возвращающий одиночное значение. Пример:
{ unary_operator } Унарные операторы можно применять только к выражениям, выполняемым с любыми типами данных из категории числовых типов данных. Оператор, имеющий только один числовой операнд: + обозначает положительное число. — обозначает отрицательное число. ~ обозначает оператор дополнения.
{ binary_operator } Этот оператор указывает, как объединяются два выражения для получения единого результата. Аргумент binary_operator может быть арифметическим, логическим, битовым или унарным оператором, а также оператором присвоения (=), сравнения или объединения (+). Дополнительные сведения об операторах см. в разделе Операторы (Transact-SQL).
ranking_windowed_function Любая ранжирующая функция языка Transact-SQL. Дополнительные сведения см. в разделе Ранжирующие функции (Transact-SQL).
aggregate_windowed_function Любая агрегатная функция языка Transact-SQL, содержащая предложение OVER. Дополнительные сведения см. в статье Предложение OVER (Transact-SQL).

SQL Справочник

SQL Ключевые слова
ADD
ADD CONSTRAINT
ALTER
ALTER COLUMN
ALTER TABLE
ALL
AND
ANY
AS
ASC
BACKUP DATABASE
BETWEEN
CASE
CHECK
COLUMN
CONSTRAINT
CREATE
CREATE DATABASE
CREATE INDEX
CREATE OR REPLACE VIEW
CREATE TABLE
CREATE PROCEDURE
CREATE UNIQUE INDEX
CREATE VIEW
DATABASE
DEFAULT
DELETE
DESC
DISTINCT
DROP
DROP COLUMN
DROP CONSTRAINT
DROP DATABASE
DROP DEFAULT
DROP INDEX
DROP TABLE
DROP VIEW
EXEC
EXISTS
FOREIGN KEY
FROM
FULL OUTER JOIN
GROUP BY
HAVING
IN
INDEX
INNER JOIN
INSERT INTO
INSERT INTO SELECT
IS NULL
IS NOT NULL
JOIN
LEFT JOIN
LIKE
LIMIT
NOT
NOT NULL
OR
ORDER BY
OUTER JOIN
PRIMARY KEY
PROCEDURE
RIGHT JOIN
ROWNUM
SELECT
SELECT DISTINCT
SELECT INTO
SELECT TOP
SET
TABLE
TOP
TRUNCATE TABLE
UNION
UNION ALL
UNIQUE
UPDATE
VALUES
VIEW
WHERE

MySQL Функции
Функции строк
ASCII
CHAR_LENGTH
CHARACTER_LENGTH
CONCAT
CONCAT_WS
FIELD
FIND_IN_SET
FORMAT
INSERT
INSTR
LCASE
LEFT
LENGTH
LOCATE
LOWER
LPAD
LTRIM
MID
POSITION
REPEAT
REPLACE
REVERSE
RIGHT
RPAD
RTRIM
SPACE
STRCMP
SUBSTR
SUBSTRING
SUBSTRING_INDEX
TRIM
UCASE
UPPER
Функции чисел
ABS
ACOS
ASIN
ATAN
ATAN2
AVG
CEIL
CEILING
COS
COT
COUNT
DEGREES
DIV
EXP
FLOOR
GREATEST
LEAST
LN
LOG
LOG10
LOG2
MAX
MIN
MOD
PI
POW
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SUM
TAN
TRUNCATE
Функции дат
ADDDATE
ADDTIME
CURDATE
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURTIME
DATE
DATEDIFF
DATE_ADD
DATE_FORMAT
DATE_SUB
DAY
DAYNAME
DAYOFMONTH
DAYOFWEEK
DAYOFYEAR
EXTRACT
FROM_DAYS
HOUR
LAST_DAY
LOCALTIME
LOCALTIMESTAMP
MAKEDATE
MAKETIME
MICROSECOND
MINUTE
MONTH
MONTHNAME
NOW
PERIOD_ADD
PERIOD_DIFF
QUARTER
SECOND
SEC_TO_TIME
STR_TO_DATE
SUBDATE
SUBTIME
SYSDATE
TIME
TIME_FORMAT
TIME_TO_SEC
TIMEDIFF
TIMESTAMP
TO_DAYS
WEEK
WEEKDAY
WEEKOFYEAR
YEAR
YEARWEEK
Функции расширений
BIN
BINARY
CASE
CAST
COALESCE
CONNECTION_ID
CONV
CONVERT
CURRENT_USER
DATABASE
IF
IFNULL
ISNULL
LAST_INSERT_ID
NULLIF
SESSION_USER
SYSTEM_USER
USER
VERSION

SQL Server функции
Функции строк
ASCII
CHAR
CHARINDEX
CONCAT
Concat with +
CONCAT_WS
DATALENGTH
DIFFERENCE
FORMAT
LEFT
LEN
LOWER
LTRIM
NCHAR
PATINDEX
QUOTENAME
REPLACE
REPLICATE
REVERSE
RIGHT
RTRIM
SOUNDEX
SPACE
STR
STUFF
SUBSTRING
TRANSLATE
TRIM
UNICODE
UPPER
Функции чисел
ABS
ACOS
ASIN
ATAN
ATN2
AVG
CEILING
COUNT
COS
COT
DEGREES
EXP
FLOOR
LOG
LOG10
MAX
MIN
PI
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SQUARE
SUM
TAN
Функции дат
CURRENT_TIMESTAMP
DATEADD
DATEDIFF
DATEFROMPARTS
DATENAME
DATEPART
DAY
GETDATE
GETUTCDATE
ISDATE
MONTH
SYSDATETIME
YEAR
Функции расширений
CAST
COALESCE
CONVERT
CURRENT_USER
IIF
ISNULL
ISNUMERIC
NULLIF
SESSION_USER
SESSIONPROPERTY
SYSTEM_USER
USER_NAME

MS Access функции
Функции строк
Asc
Chr
Concat with &
CurDir
Format
InStr
InstrRev
LCase
Left
Len
LTrim
Mid
Replace
Right
RTrim
Space
Split
Str
StrComp
StrConv
StrReverse
Trim
UCase
Функции чисел
Abs
Atn
Avg
Cos
Count
Exp
Fix
Format
Int
Max
Min
Randomize
Rnd
Round
Sgn
Sqr
Sum
Val
Функции дат
Date
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Day
Format
Hour
Minute
Month
MonthName
Now
Second
Time
TimeSerial
TimeValue
Weekday
WeekdayName
Year
Другие функции
CurrentUser
Environ
IsDate
IsNull
IsNumeric

SQL ОператорыSQL Типы данныхSQL Краткий справочник

Создание таблицы

  1. Удалите содержимое в окне редактора кода.

  2. Нажмите клавиши CTRL+SHIFT+P или F1, чтобы открыть палитру команд.

  3. Введите sql, чтобы отобразить команды mssql, или введите sqluse, а затем выберите команду MS SQL: использовать базу данных.

  4. Выберите новую базу данных TutorialDB.

  5. В редакторе кода введите sql, чтобы отобразить фрагменты кода, выберите фрагмент sqlCreateTable и нажмите клавишу ВВОД.

  6. Во фрагменте введите в качестве имени таблицы.

  7. Нажмите клавишу TAB, чтобы перейти к следующему полю, а затем введите в качестве имени схемы.

  8. Замените определения столбцов следующими столбцами:

  9. Нажмите клавиши CTRL+SHIFT+E, чтобы создать таблицу.

Использование Transact-SQL

Задание параметра max degree of parallelism для существующего индекса

  1. В обозревателе объектов подключитесь к экземпляру компонента Компонент Database Engine.

  2. На стандартной панели выберите пункт Создать запрос.

  3. Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить.

Дополнительные сведения см. в разделе ALTER INDEX (Transact-SQL).

Задание параметра max degree of parallelism для нового индекса

  1. В обозревателе объектов подключитесь к экземпляру компонента Компонент Database Engine.

  2. На стандартной панели выберите пункт Создать запрос.

  3. Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить.

Результаты выражения

Для простых выражений, состоящих из одной константы, переменной, скалярной функции или имени столбца, в качестве типа данных, параметров сортировки, числа разрядов, точности и значения выражения используются тип данных, параметры сортировки, число разрядов, точность и значение элемента, на который они ссылаются.

При объединении двух выражений с помощью операторов сравнения или логических операторов результат будет иметь логический тип данных и может принимать одно из следующих значений: TRUE, FALSE или UNKNOWN. Дополнительные сведения о логических типах данных см. в разделе Операторы сравнения (Transact-SQL).

При объединении двух выражений с помощью арифметических, побитовых или строковых операторов тип данных результата определяется используемым оператором.

Сложные выражения, составленные из нескольких символов и операторов, вычисляются в одиночные результаты. Тип данных, параметры сортировки, точность и значение результирующего выражения определяются объединением составляющих выражений (по два за один раз) до тех пор, пока не будет получен конечный результат. Последовательность, в которой эти выражения объединяются, зависит от приоритета операторов в выражении.

SQL Учебник

SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии

Функция IIF языка T-SQL

IIF – логическая функция языка T-SQL, которая возвращает одно из двух значений в зависимости от результата логического выражения. Появилась данная функция в 2012 версии SQL Server.

Синтаксис IIF

IIF ( boolean_expression, true_value, false_value ) 

где,

  • boolean_expression – логическое выражение. Если указано не логическое выражение, то возникнет ошибка синтаксиса;
  • true_value – значение, которое будет возвращено, если boolean_expression имеет значение TRUE;
  • false_value – значение, которое будет возвращено, если boolean_expression имеет значение FALSE.

Таким образом, функция IIF имеет 3 параметра, в первом параметре указывается логическое выражение, во втором мы пишем значение, которое будет возвращено, если логическое выражение вернет TRUE, в третьем — значение, которое будет возвращено, если логическое выражение вернет FALSE.

Особенности работы функции IIF

true_value и false_value могут иметь разные типы данных, при этом функция IIF вернет результат с тем типом данных, который будет иметь наивысший приоритет.

Если рассматривать внутреннюю работу функции IIF, то все действия в ней приводятся к выражению CASE и, таким образом, функция IIF является абсолютным эквивалентом выражения CASE, а создана и применяется она для более быстрого и простого написания логических выражений с использованием CASE.

Параметры true_value и false_value не могут одновременно содержать значения NULL, как минимум одно из этих значений должно отличаться от NULL, в противном случае, т.е. если указать NULL для обоих этих параметров, мы получим примерно следующую ошибку

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

Теперь допустим, что нам необходимо вывести иерархический список сотрудников, т.е. мы хотим видеть, на каком уровне работает тот или иной сотрудник. Для этого пишем рекурсивный запрос:

 
   WITH TestCTE(UserID, Post, ManagerID, LevelUser)
   AS
   (    
        -- Находим якорь рекурсии
        SELECT UserID, Post, ManagerID, 0 AS LevelUser 
        FROM TestTable WHERE ManagerID IS NULL
        UNION ALL
        --Делаем объединение с TestCTE (хотя мы его еще не дописали)
        SELECT t1.UserID, t1.Post, t1.ManagerID, t2.LevelUser + 1 
        FROM TestTable t1 
        JOIN TestCTE t2 ON t1.ManagerID=t2.UserID
   )
   SELECT * FROM TestCTE ORDER BY LevelUser

В итоге, если мы захотим, мы можем легко получить список сотрудников определенного уровня, например, нам нужны только начальники отделов, для этого мы просто в указанный выше запрос добавим условие WHERE LevelUser = 1

При написании рекурсивного ОТВ нужно быть внимательным, так как неправильное его составление может привести к бесконечному циклу. Поэтому для этих целей есть опция MAXRECURSION, которая может ограничивать количество уровней рекурсии. Давайте представим, что мы не уверены, что написали рекурсивное обобщенное выражение правильно и для отладки напишем инструкцию OPTION (MAXRECURSION 5), т.е. отобразим только 5 уровня рекурсии, и если уровней будет больше, SQL инструкция будет прервана.

 
   WITH TestCTE(UserID, Post, ManagerID, LevelUser)
   AS
   (    
        --Находим якорь рекурсии
        SELECT UserID, Post, ManagerID, 0 AS LevelUser 
        FROM TestTable WHERE ManagerID IS NULL
        UNION ALL
        --Делаем объединение с TestCTE (хотя мы его еще не дописали)
        SELECT t1.UserID, t1.Post, t1.ManagerID, t2.LevelUser + 1 
        FROM TestTable t1 
        JOIN TestCTE t2 ON t1.ManagerID=t2.UserID
   )
   SELECT * FROM TestCTE ORDER BY LevelUser
   OPTION (MAXRECURSION 5)

Запрос у нас отработал, что говорит о том, что мы написали его правильно и соответственно OPTION (MAXRECURSION 5) можно смело убрать.

На этом у меня все, удачи!

Нравится44Не нравится4

Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)

Ж. Использование инструкции SELECT с выражением CASE

При использовании в инструкции SELECT выражение CASE позволяет заменять значения в результирующем наборе в зависимости от результатов сравнения. В приведенном ниже примере выражение CASE используется для изменения способа отображения категорий линейки продуктов с целью сделать их более понятными. Если значение отсутствует, выводится текст «Not for sale».

З. Использование выражения CASE в инструкции UPDATE

В следующем примере выражение CASE используется в инструкции UPDATE, чтобы определить значение, установленное в столбце для сотрудников, у которых столбец имеет значение 0. Если при вычитании 10 часов из получается отрицательное значение, увеличивается на 40 часов. В противном случае значение увеличивается на 20 часов.

Аргументы

order_by_expression
Указывает столбец или выражение, по которому производится сортировка результирующего набора запроса. Столбец сортировки может быть указан с помощью имени или псевдонима столбца или неотрицательного целого числа, представляющего позицию столбца в списке выбора.

Можно указать несколько столбцов сортировки. Имена столбцов должны быть уникальными. Последовательность столбцов сортировки в предложении ORDER BY определяет организацию упорядоченного результирующего набора. Иными словами, результирующий набор сортируется по первому столбцу, затем упорядоченный список сортируется по второму и т. д.

Имена столбцов, на которые содержатся ссылки в предложении ORDER BY, должны однозначно соответствовать столбцу или псевдониму столбца в списке выбора либо столбцу, определенному в таблице, указанной в предложении FROM. Если предложение ORDER BY ссылается на псевдоним столбца в списке выбора, псевдоним должен использоваться отдельно, а не как часть выражения в предложении ORDER BY, например:

COLLATE collation_name
Указывает, что операция ORDER BY должна выполняться в соответствии с параметрами сортировки, указанными в аргументе collation_name, но не в соответствии с параметрами сортировки столбца, определенными в таблице или представлении. Аргументом collation_name может быть либо имя параметров сортировки Windows, либо имя параметров сортировки SQL. Дополнительные сведения см. в статье Collation and Unicode Support. Аргумент COLLATE применяется только к столбцам типа char, varchar, nchar и nvarchar.

ASC | DESC
Указывает порядок сортировки значений в указанном столбце — по возрастанию или по убыванию. Значение ASC сортирует от низких значений к высоким. Значение DESC сортирует от высоких значений к низким. Порядок сортировки по умолчанию — ASC. Значения NULL рассматриваются как минимально возможные значения.

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Указывает число сток, которые необходимо пропустить, прежде чем будет начат возврат строк из выражения запроса. Это значение может быть целочисленной константой или выражением, значение которого больше нуля или равно нулю.

Применимо к: SQL Server 2012 (11.x) и выше, База данных SQL Azure.

offset_row_count_expression может быть переменной, параметром или вложенным запросом, возвращающим скалярную константу. При использовании вложенного запроса он не должен ссылаться на какие-либо столбцы, определенные в области внешнего запроса. Иными словами, он не может коррелировать с внешним запросом.

ROW и ROWS являются синонимами и оставлены для совместимости со стандартом ANSI.

В плане выполнения запроса значение смещения строки отображается в атрибуте Offset оператора запроса TOP.

FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
Указывает число строк, возвращаемых после обработки предложения OFFSET. Это значение может быть целочисленной константой или выражением, значение которого больше единицы или равно единице.

Применимо к: SQL Server 2012 (11.x) и выше, а также База данных SQL Azure.

fetch_row_count_expression может быть переменной, параметром или вложенным запросом, возвращающим скалярную константу. При использовании вложенного запроса он не должен ссылаться на какие-либо столбцы, определенные в области внешнего запроса. Иными словами, он не может коррелировать с внешним запросом.

FIRST и NEXT являются синонимами и предусмотрены для совместимости со стандартом ANSI.

ROW и ROWS являются синонимами и оставлены для совместимости со стандартом ANSI.

В плане выполнения запроса значение смещения строки отображается в атрибуте Rows или Top оператора запроса TOP.

Какие бывают обобщенные табличные выражения?

Они бывают простые и рекурсивные.

Простые не включают ссылки на самого себя, а рекурсивные соответственно включают.

Рекурсивные ОТВ используются для возвращения иерархических данных, например, классика жанра это отображение сотрудников в структуре организации (чуть ниже мы это рассмотрим).

В качестве тестовых данных давайте использовать таблицу TestTable, которая будет содержать идентификатор сотрудника, его должность и идентификатор его начальника.

Где,

  • UserID — идентификатор сотрудника;
  • Post — должность;
  • ManagerID — идентификатор начальника.

Как видите, у директора отсутствует ManagerID, так как у него нет начальника. А теперь переходим к примерам.

Возможность создания дополнительных фильтров

Я показал, как в T-SQL можно прибегнуть к обходному решению и косвенным образом использовать оконные функции в элементах, которые не поддерживают их напрямую. Это обходное решение основано на применении табличного выражения в форме CTE или производной таблицы. Приятно иметь дополнительный вариант, но в табличном выражении используется дополнительный уровень запроса и все немного усложняется. Приведенные мной примеры просты, но как насчет длинных и сложных запросов. Возможно ли более простое решение без этого дополнительного уровня?

Если говорить об оконных функциях, то в SQL Server на текущий момент нет другого решения. Вместе с тем, интересно посмотреть, как другие справляются с этой проблемой. Например, в Teradata создали фильтрующее предложение, которое называется QUALIFY и принципиально вычисляется после предложения SELECT. Это означает, что в нем можно напрямую обращаться к оконным функциям, как в следующем примере:

Более того, можно ссылаться на псевдонимы столбцов, определенных в списке SELECT, так:

Предложения QUALIFY нет в стандартном SQL — оно поддерживается только в продуктах Teradata. Но оно кажется очень интересным решением, и было бы неплохо, если бы и стандарт, и в SQL Server удовлетворили такую потребность.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: