Как написать оператор 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

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

SergeS
источник
Я не могу заставить это работать с моим кодом, возможно, мое размещение неправильное или что-то в этом роде: 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
Ссылка на решение приветствуется, но убедитесь, что ваш ответ полезен и без нее: добавьте контекст вокруг ссылки, чтобы ваши друзья-пользователи имели некоторое представление, что это такое и почему оно есть, а затем процитируйте наиболее релевантную часть страницы, которую вы повторная ссылка на, если целевая страница недоступна. Ответы, которые представляют собой не более чем ссылку, могут быть удалены.
МАР