Как написать оператор IF ELSE в запросе MySQL


86

Как написать инструкцию IF ELSE в запросе MySQL?

Что-то вроде этого:

mysql_query("...(irrelevant code).. IF(action==2&&state==0){state=1}");

Затем в моем массиве я смогу сделать это:

 $row['state'] 
//this should equal 1, the query should not change anything in the database, 
//just the variable for returning the information

Ответы:


150

Вероятно, вы захотите использовать CASEвыражение .

Они выглядят так:

SELECT col1, col2, (case when (action = 2 and state = 0) 
 THEN
      1 
 ELSE
      0 
 END)
 as state from tbl1;

1
Спасибо, ваш ответ казался более легким для понимания (насколько это возможно, если случай должен входить в запрос, однако мне не удалось заставить его работать должным образом: «SELECT *, N.id (CASE WHEN (N. action == 2 AND N.state == 0) THEN 1 ELSE 0 END) AS N.state FROM notifications N, messages P WHERE N.userID = '$ session' AND N.uniqueID = P.id AND P.state = '0' И N.action = '1' ORDER BY N.date DESC "
Дилан Кросс

2
@DylanCross Похоже, у вас не хватает запятой между N.idи(CASE WHEN ...
Джек Эдмондс

1
Ааа, не видел, но даже когда ставлю запятую, не работает.
Дилан Кросс

@DylanCross Вам также может потребоваться изменить AS N.stateна AS state.
Джек Эдмондс,

8
@DylanCross Разве MySQL не использует =вместо ==сравнения?
Джек Эдмондс

28

вы должны писать его на SQL, а не в стиле C / PHP

IF( action = 2 AND state = 0, 1, 0 ) AS state

для использования в запросе

IF ( action = 2 AND state = 0 ) THEN SET state = 1

для использования в хранимых процедурах или функциях


Я не могу заставить это работать с моим кодом, возможно, мое размещение неправильное или что-то в этом роде: SELECT *, N.id IF (N.action = 2 AND N.state = 0, 1, 0) AS N.state FROM notifications N, posts P WHERE N.userID = '$ session' AND N.uniqueID = P.id AND P.state = '0' AND N.action = '1' ORDER BY N date DESC
Dylan Cross

15

Вы ищете case:

case when action = 2 and state = 0 then 1 else 0 end as state

В MySQL есть ifсинтаксис ( if(action=2 and state=0, 1, 0)), но caseон более универсален.

Обратите внимание, что as stateэто просто псевдоним столбца. Я предполагаю, что это находится в списке столбцов вашего SQL-запроса.


Это гораздо лучший ответ
bretterer

15
SELECT col1, col2, IF( action = 2 AND state = 0, 1, 0 ) AS state from tbl1;

ИЛИ

SELECT col1, col2, (case when (action = 2 and state = 0) then 1 else 0 end) as state from tbl1;

оба результата будут одинаковыми ....


одна вещь, которую я заметил, но не смог найти документации, это то, что IF должен быть последним в списке столбцов. Если первый, то выдает ошибку. Кто-нибудь знает, где это увидеть в документации? Это сводит меня с ума. Когда я что-то обнаруживаю, мне нравится видеть это задокументированным для использования в будущем
carinlynchin

8

согласно справочному руководству mySQL, это синтаксис использования оператора if и else:

IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF

Итак, что касается вашего запроса:

x = IF((action=2)&&(state=0),1,2);

или вы можете использовать

IF ((action=2)&&(state=0)) then 
state = 1;
ELSE 
state = 2;
END IF;

По этой ссылке есть хороший пример: http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/


2
Ссылка на решение приветствуется, но убедитесь, что ваш ответ полезен и без нее: добавьте контекст вокруг ссылки, чтобы ваши друзья-пользователи имели некоторое представление, что это такое и почему оно есть, а затем процитируйте наиболее релевантную часть страницы, которую вы повторная ссылка на, если целевая страница недоступна. Ответы, которые представляют собой не более чем ссылку, могут быть удалены.
МАР
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.