2014-11-26 4 views
0

Я использую MySQL 5.5.38, и я пытался сгенерировать результат с нулевыми строками с SELECT.SELECT ... WHERE без FROM синтаксическая ошибка

Использование несуществующих DUAL таблицы, он работает:

SELECT 123 FROM DUAL WHERE FALSE 

Но обычная версия дает синтаксическую ошибку:

SELECT 123 WHERE FALSE 

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 'WHERE FALSE' at line 1

это ошибка MySQL или я пропустил что-то?

http://sqlfiddle.com/#!9/d41d8/1028

+2

Обязательное условие 'FROM' – diEcho

+0

@diEcho:' SELECT 1' является допустимым запросом, мне было любопытно, можете ли вы переключаться между возвращением 0 или 1 строк с помощью 'WHERE'. – biziclop

+0

MySQL не поддерживает это. –

ответ

3

Я не могу найти, что синтаксис documented так что технически неподдерживаемый:

SELECT 
    [ALL | DISTINCT | DISTINCTROW ] 
     [HIGH_PRIORITY] 
     [STRAIGHT_JOIN] 
     [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 
     [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] 
    select_expr [, select_expr ...] 
    [FROM table_references 
     [PARTITION partition_list] 
    [WHERE where_condition] 
    [GROUP BY {col_name | expr | position} 
     [ASC | DESC], ... [WITH ROLLUP]] 
    [HAVING where_condition] 
    [ORDER BY {col_name | expr | position} 
     [ASC | DESC], ...] 
    [LIMIT {[offset,] row_count | row_count OFFSET offset}] 
    [PROCEDURE procedure_name(argument_list)] 
    [INTO OUTFILE 'file_name' 
     [CHARACTER SET charset_name] 
     export_options 
     | INTO DUMPFILE 'file_name' 
     | INTO var_name [, var_name]] 
    [FOR UPDATE | LOCK IN SHARE MODE]] 

Как вы можете видеть, FROM не является обязательным, но WHERE требует FROM:

[FROM table_references 
     [PARTITION partition_list] 
    [WHERE where_condition] 

В любом случае, не кажется особенно полезным распечатать строку и сразу же отфильтровать ее, не так ли?

It might be useful for unioning multiple similar selects

Это другой запрос, при этом другой синтаксис ... с FROM ;-)

SELECT * 
FROM (
    SELECT 123 AS foo 
    UNION 
    SELECT 456 
    UNION 
    SELECT 789 
) data 
WHERE foo<>456 

Если вы просто добавить равнину WHERE в конце концов, вы только бы фильтрацию последнего ВЫБРАТЬ ,

+0

Возможно, это будет полезно для объединения нескольких похожих элементов. На самом деле я просто что-то проверил и нашел это странным. Кроме того, я не понял, что '[FROM ...' does 't имеет закрытие'] 'в конце строки, теперь это понятно. – biziclop

+0

+100 на самом деле это очень полезно. Спасибо, что разделили эту большую часть информации. – diEcho

0

Попробуйте

SELECT column FROM TABLE WHERE column = 'FALSE' 
+0

Это не работает в MySQL, возможно, только в Oracle. –

+0

В mySQL - «TRUE» и «FALSE» являются синонимами для TINYINT (1). – Haris

+0

Таблица «DUAL» не существует в MySQL. –

3

Проверьте syntax:

SELECT 
    [ALL | DISTINCT | DISTINCTROW ] 
     [HIGH_PRIORITY] 
     [STRAIGHT_JOIN] 
     [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 
     [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] 
    select_expr [, select_expr ...] 
    [FROM table_references 
    [WHERE where_condition] 
    [GROUP BY {col_name | expr | position} 
     [ASC | DESC], ... [WITH ROLLUP]] 
    [HAVING where_condition] 
    [ORDER BY {col_name | expr | position} 
     [ASC | DESC], ...] 
    [LIMIT {[offset,] row_count | row_count OFFSET offset}] 
    [PROCEDURE procedure_name(argument_list)] 
    [INTO OUTFILE 'file_name' 
     [CHARACTER SET charset_name] 
     export_options 
     | INTO DUMPFILE 'file_name' 
     | INTO var_name [, var_name]] 
    [FOR UPDATE | LOCK IN SHARE MODE]] 

И обратите внимание, что, в то время как FROMявляется необязательными, все последующие особенности содержатся в [] блоке то есть вокруг FROM - если вы хотите использовать любую из этих функций, вам понадобится статья FROM.

0

FROM DUAL - это база данных оракула. В MySQL вы можете просто перенесите из вообще

SELECT 123 

или

SELECT now() 

, например.

Смежные вопросы