Функция nullif (transact-sql)nullif (transact-sql)

SQL References

SQL Keywords 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 Functions String Functions 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

Numeric Functions 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

Date Functions 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

Advanced Functions 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 Functions String Functions 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

Numeric Functions 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

Date Functions CURRENT_TIMESTAMP DATEADD DATEDIFF DATEFROMPARTS DATENAME DATEPART DAY GETDATE GETUTCDATE ISDATE MONTH SYSDATETIME YEAR

Advanced Functions CAST COALESCE CONVERT CURRENT_USER IIF ISNULL ISNUMERIC NULLIF SESSION_USER SESSIONPROPERTY SYSTEM_USER USER_NAME

MS Access Functions String Functions Asc Chr Concat with & CurDir Format InStr InstrRev LCase Left Len LTrim Mid Replace Right RTrim Space Split Str StrComp StrConv StrReverse Trim UCase

Numeric Functions Abs Atn Avg Cos Count Exp Fix Format Int Max Min Randomize Rnd Round Sgn Sqr Sum Val

Date Functions Date DateAdd DateDiff DatePart DateSerial DateValue Day Format Hour Minute Month MonthName Now Second Time TimeSerial TimeValue Weekday WeekdayName Year

Other Functions CurrentUser Environ IsDate IsNull IsNumeric

SQL OperatorsSQL Data TypesSQL Quick Ref


SQL References

SQL Keywords 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 Functions String Functions 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

Numeric Functions 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

Date Functions 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

Advanced Functions 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 Functions String Functions 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

Numeric Functions 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

Date Functions CURRENT_TIMESTAMP DATEADD DATEDIFF DATEFROMPARTS DATENAME DATEPART DAY GETDATE GETUTCDATE ISDATE MONTH SYSDATETIME YEAR

Advanced Functions CAST COALESCE CONVERT CURRENT_USER IIF ISNULL ISNUMERIC NULLIF SESSION_USER SESSIONPROPERTY SYSTEM_USER USER_NAME

MS Access Functions String Functions Asc Chr Concat with & CurDir Format InStr InstrRev LCase Left Len LTrim Mid Replace Right RTrim Space Split Str StrComp StrConv StrReverse Trim UCase

Numeric Functions Abs Atn Avg Cos Count Exp Fix Format Int Max Min Randomize Rnd Round Sgn Sqr Sum Val

Date Functions Date DateAdd DateDiff DatePart DateSerial DateValue Day Format Hour Minute Month MonthName Now Second Time TimeSerial TimeValue Weekday WeekdayName Year

Other Functions CurrentUser Environ IsDate IsNull IsNumeric

SQL OperatorsSQL Data TypesSQL Quick Ref

Конструкция IF-THEN-ELSIF

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

Некоторые программисты пытаются записывать в виде или . Это очень распространенная синтаксическая ошибка.

Формально конструкция представляет собой один из способов реализации функций команды в PL/SQL. Конечно, если вы используете Oracle9i, лучше воспользоваться командой , о которой будет рассказано далее в следующей статье.

В каждой секции (кроме секции ) за условием должно следовать ключевое слово . Секция в означает «если не выполняется ни одно из условий», то есть когда ни одно из условий не равно , выполняются команды, следующие за . Следует помнить, что секция не является обязательной — конструкция может состоять только из секций и . Если ни одно из условий не равно , то никакие команды блока не выполняются.

Далее приводится полная реализация логики назначения премий, описанной в начале статьи, на базе конструкции :

Ловушки синтаксиса IF

Запомните несколько правил, касающихся применения команды :

  • Каждая команда должна иметь парную конструкцию . Все три разновидности данной команды обязательно должны явно закрываться ключевым словом .
  • Не забывайте разделять пробелами ключевые слова и . Если вместо ввести , компилятор выдаст малопонятное сообщение об ошибке:
       ORA-06550: line 14, column 4:
       PLS-00103: Encountered the symbol ";" when expecting one of the following:
  • Ключевое слово должно содержать только одну букву «». Если вместо ключевого слова указать , компилятор не воспримет последнее как часть команды . Он интерпретирует его как имя переменной или процедуры.
  • Точка с запятой ставится только после ключевых слов . После ключевых слов и точка с запятой не ставится. Они не являются отдельными исполняемыми командами и, в отличие от , не могут завершать команду PL/SQL. Если вы все же поставите точку с запятой после этих ключевых слов, компилятор выдаст сообщение об ошибке.

Условия всегда обрабатываются от первого к последнему. Если оба условия равны , то выполняются команды первого условия. В контексте текущего примера для оклада $20000 будет начислена премия $1500, хотя оклад $20 000 также удовлетворяет условию премии $1000 (проверка включает границы). Если какое-либо условие истинно, остальные условия вообще не проверяются.

Команда позволяет решить задачу начисления премии более элегантно, чем решение в этом разделе (см. раздел «Команды и выражения »).

И хотя в команде разрешены перекрывающиеся условия, лучше избегать их там, где это возможно. В моем примере исходная спецификация немного неоднозначна в отношении граничных значений (таких, как 20 000). Если предположить, что работникам с низшими окладами должны начисляться более высокие премии (что на мой взгляд вполне разумно), я бы избавился от а и воспользовался логикой «меньше/больше» (см. далее)

Также обратите внимание на отсутствие секции — я опустил ее просто для того, чтобы показать, что она не является обязательной:

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

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

Смешанные процедурные инструкции

Процедурные расширения языка Transact-SQL также содержат следующие инструкции:

  • RETURN;


  • GOTO;

  • RAISEERROR;

  • WAITFOR

Инструкция RETURN выполняет ту же самую функцию внутри пакета, что и инструкция BREAK внутри цикла WHILE. Иными словами, инструкция RETURN останавливает выполнение пакета и начинает исполнение первой инструкции, следующей за пакетом.

Инструкция GOTO передает управление при выполнении пакета инструкции Transact-SQL внутри пакета, обозначенной маркером. Инструкция RAISEERROR выводит определенное пользователем сообщение об ошибке и устанавливает флаг системной ошибки. Номер ошибки в определяемом пользователем сообщении должен быть больше, чем 50 000, т.к. все номера ошибок меньшие или равные 50 000 определены системой и зарезервированы компонентом Database Engine. Значения номеров ошибок сохраняются в глобальной переменной @@error.

Инструкция WAITFOR определяет задержку на период времени (с параметром DELAY) или определенное время (с параметром TIME), на протяжении которой система должна ожидать, прежде чем исполнять следующую инструкцию пакета. Синтаксис этой инструкции выглядит следующим образом:

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

Introduction

In real life, we make decisions based on the conditions. For example, look at the following conditions.

  • If I get a performance bonus this year, I will go for international vacation or else I’ll take a domestic vacation
  • If the weather becomes good, I will plan to go on a bike trip or else I won’t

In these examples, we decide as per the conditions. For example, if I get a bonus then only I will go for an international vacation else I will go for domestic vacations. We need to incorporate these conditions-based decisions in programming logic as well. SQL Server provides the capability to execute real-time programming logic using SQL IF Statement.

Пример

Рассмотрим примеры MySQL функции IF, чтобы понять, как использовать функцию IF в MySQL.

Функция MySQL IF — возвращает строковое значение

Этот первый пример функции IF показывает, как вы могли бы вернуть строковое значение.

Например:

MySQL

mysql> SELECT IF(100<200, ‘y’, ‘n’);

#Результат: y

1 2 3 mysql>SELECTIF(100<200,’y’,’n’);   #Результат:  y

В этом примере функции IF условие 100


MySQL

mysql> SELECT IF(STRCMP(‘google.com’,’yandex.ru’)=0, ‘yes’, ‘no’);

#Результат: no

1 2 3 mysql>SELECTIF(STRCMP(‘google.com’,’yandex.ru’)=0,’yes’,’no’);   #Результат:  no

В этом примере функция IF использует функцию STRCMP для сравнения двух строк: STRCMP(‘google.com’,’yandex.ru’). Если строка ‘google.com’ совпадает с строкой ‘yandex.ru’, то функция IF вернет ‘yes’. В противном случае, функция IF вернет ‘no’.

Функция MySQL IF — возвращает числовое значение

Следующий пример функции IF показывает, как вы должны возвращать числовое значение.

Например:

MySQL

mysql> SELECT IF(10<20, 300, 500);

#Результат: 300

1 2 3 mysql>SELECTIF(10<20,300,500);   #Результат:  300

В этом примере функции IF условие 10Функция MySQL IF — добавляет поле

Давайте рассмотрим пример, в котором функция IF используется для проверки значения поля в таблице.

Например:

MySQL

mysql> SELECT supplier_id, supplier_name, quantity, IF(quantity>10, ‘More’, ‘Less’) FROM suppliers;

1 2 3 4 5

mysql>SELECTsupplier_id,

supplier_name,

quantity,

IF(quantity>10,’More’,’Less’)

FROMsuppliers;

В этом примере функция IF проверяет значение поля quantity в таблице suppliers. Функция IF будет оценивать условие quantity > 10 для каждой строки в нашем наборе результатов.

Таким образом (для каждой строки), если quantity > 10, функция IF вернет ‘More’. В противном случае функция IF вернет значение ‘Less’.

MySQL IF-THEN-ELSE statement

In case you want to execute other statements when the in the branch does not evaluate to , you can use the statement as follows:


In this syntax, if the evaluates to , the between and execute. Otherwise, the between the and execute.

Let’s modify the stored procedure.

First, drop the stored procedure:

Then, create the stored procedure with the new code:

In this new stored procedure, we include the branch. If the is not greater than , we set the customer level to in the block between and .

This query finds customers that have credit limit less than or equal :

This picture shows the partial output:

The following statements call the stored procedure for customer number  and show the value of the parameter :

The credit limit of the customer is less than , therefore, the statement in the branch executes and sets the value of the parameter to .

Инструкция IF

Инструкция IF языка Transact-SQL соответствует одноименной инструкции, поддерживаемой почти всеми языками программирования. Инструкция IF выполняет одну или несколько составляющих блок инструкций, если логическое выражение, следующее после ключевого слова IF, возвращает значение true (истина). Если же инструкция IF содержит оператор ELSE, то при условии, что логическое выражение возвращает значение false (ложь), выполняется вторая группа инструкций.

Ниже показан пример использования условной инструкции IF:

В этом примере демонстрируется использование блока инструкций внутри инструкции IF. Следующее далее логическое выражение инструкции IF:

(SELECT COUNT(*)
        FROM Works_on
        WHERE ProjectNumber = 'p1'
            GROUP BY ProjectNumber ) > 3

возвращает значение true (истина) для базы данных SampleDb. Поэтому будет выполняться инструкция PRINT, входящая в часть инструкции IF

Обратите внимание на то обстоятельство, что в этом примере используется подзапрос, чтобы возвратить число строк (посредством агрегатной функции COUNT), удовлетворяющих условию предложения WHERE (ProjectNumber=’p1′)

Оператор ELSE инструкции IF в примере содержит две инструкции: PRINT и SELECT. Поэтому для выполнения этих инструкций их необходимо заключить в блок между ключевыми словами BEGIN и END. (Инструкция PRINT является процедурным расширением и возвращает определяемое пользователем сообщение.)


С этим читают