Як писати оператор 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) ЯК N.state ІЗ сповіщень N, повідомлення P WHERE N.userID = '$ session' AND N.uniqueID = P.id AND P.state = '0' AND N.action = '1' ЗАМОВЛЕННЯ N.date DESC "
Ділан Крос

2
@DylanCross Схоже, вам може не вистачати коми між N.idі(CASE WHEN ...
Джек Едмондс

1
Ага, не бачив цього, але навіть коли я ставлю кому, це не працює.
Ділан Крос

@DylanCross Вам також може знадобитися змінити AS N.stateна AS state.
Джек Едмондс,

8
@DylanCross Чи не MySQL використовує =замість ==порівняння?
Джек Едмондс

27

ви повинні писати це в 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 повідомлення N, повідомлення P ДЕ 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;

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


одне, що я помітив, але не зміг знайти документацію щодо нього, це те, що ІФ повинен бути останнім у списку стовпців. Якщо це перший, то він видає помилку. Хтось знає, де це можна побачити в документації? Це зводить мене з розуму. Коли я щось виявляю, мені подобається бачити це документально для подальшого використання
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.