Ошибка в запросе MySQL относительно операторов IF в SELECT

#mysql #mysql-python

#mysql #mysql-python

Вопрос:

Я не могу понять, что не так со следующим запросом:

 SELECT   t_sh.source_file_id,
         t_sh.id,
         MAX(t_sh.master_event_id),
         IF(t_sh.content REGEXP '[;}[:space:]]break;', 'true', 'false') AS break,
         IF(t_sh.content REGEXP '[;}[:space:]]break ', 'true', 'false') AS break_label,
         IF(t_sh.content REGEXP '[;}[:space:]]continue;', 'true', 'false') AS continue,
         IF(t_sh.content REGEXP '[;}[:space:]]throw ', 'true', 'false') AS throw,
         IF(t_sh.content REGEXP '[;}[:space:]]return;', 'true', 'false') AS void_return
FROM     source_histories AS t_sh,
         (   SELECT DISTINCT source_file_id
             FROM source_histories
             WHERE content <> NULL 
                 AND content REGEXP '[;}[:space:]]break;|[;}[:space:]]break |[;}[:space:]]continue;|[;}[:space:]]throw |[;}[:space:]]return;'
         ) AS t_uniqueSFI
WHERE t_sh.source_file_id = t_uniqueSFI.source_file_id;
 

При запуске с MySQLdb python выдает следующую ошибку:

 _mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near
'continue,ntttttttIF(t_sh.content REGEXP '[;}[:space:]]throw ', 'true', 'false') ' at line 6")
 

Я новичок в SQL, и ваша помощь очень ценится.

Ответ №1:

Проблемная строка

 IF(t_sh.content REGEXP '[;}[:space:]]continue;', 'true', 'false') as continue
 

continue — это зарезервированное слово, и вам нужно вернуть что-то как

 IF(t_sh.content REGEXP '[;}[:space:]]continue;', 'true', 'false') as `continue`
 

Вот что происходит в mysql, когда ваш запрос приходит к этой строке

 mysql> select IF(uname REGEXP '[;}[:space:]]continue;', 'true', 'false') 
AS continue from test ;
ERROR 1064 (42000): You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for 
the right syntax to use near 'continue from test' at line 1
 

Теперь, если я использую обратную ссылку в своей тестовой таблице, я получаю

 mysql> select IF(uname REGEXP '[;}[:space:]]continue;', 'true', 'false')
 AS `continue` from test ;
 ---------- 
| continue |
 ---------- 
| false    |
| false    |
| false    |
| false    |
| false    |
| false    |
| false    |
 ---------- 
 

Комментарии:

1. Большое вам спасибо! Я должен был знать, чтобы посмотреть на зарезервированные слова.