SELECT * FROM tableName WHERE 'num + sometext'

0

Мне любопытно узнать, как эти запросы работают в базе данных. Специально я сосредоточен на линиях № 4 и 6.

1.SELECT * FROM tableName
2.SELECT * FROM tableName WHERE 1
3.SELECT * FROM tableName WHERE 123
4.SELECT * FROM tableName WHERE '2xyz'

5.SELECT * FROM tableName WHERE ''
6.SELECT * FROM tableName WHERE 'xyz'

В вышеуказанных запросах 1,2,3,4 производят одинаковый результат, но 5 и 6 не дают никакого результата. Зачем? что такое diff b/w WHERE '2xyx' и 'xyz'? Как "2xyz" неявно преобразован в 2?

  • 0
    Теперь мне интересно, какой результат дает 2 и 3 в sql ? потому что нет никакого отношения к полю в таблице ... и вы должны увидеть эту ошибку (для второй строки, которую вы написали): An expression of non-boolean type specified in a context where a condition is expected, near '1'.
  • 0
    я только что проверил 1, 2 и 3 получаются одинаковые результаты @KarenAni
Показать ещё 1 комментарий
Теги:

4 ответа

2

Предложение where оценивает значение boolean true (не 0) или false (0), чтобы решить, находится ли запись в или из набора результатов.

  • Случаи 2 и 3 извлекают все записи, потому что ненулевые числа оцениваются как истинные.

  • Случай 3 извлекает все записи, потому что во время неявной строки для преобразования чисел mysql оценивает строку слева направо по символу. Пока символы могут быть оценены как число, mysql примет значение. Это включает измельчение ведущих пространств, интерпретацию знаков плюс или минус, десятичных точек и т.д. Таким образом, строка '2xyx' интерпретируется как 2, поэтому логическая истина.

  • Случай 4 и 5 не извлекает никаких записей, потому что самый левый символ строк не может быть оценен как число, поэтому преобразование возвращает 0, таким образом, логическое значение false.

К сожалению, неявное преобразование строк в числовое значение в документе MySQL не документировано. Однако большинство правил можно вычесть из следующей части в разделе " Преобразование типов в разделе оценки выражений " руководства:

Для сравнения столбца строки с номером MySQL не может использовать индекс в столбце для быстрого поиска значения. Если str_col является индексированным столбцом строки, индекс не может использоваться при выполнении поиска в следующем выражении:

SELECT * FROM tbl_name WHERE str_col=1;1

Причина этого в том, что существует много разных строк, которые могут преобразовать значение 1, например "1", "1" или "1a".

  • 0
    Хороший ответ. Может быть, добавьте ссылку на документ, чтобы обеспечить будущие точки репутации +1.
  • 0
    @TimBiegeleisen это на самом деле не задокументировано (по крайней мере, я не смог найти ни одного хорошего официального описания), добавил то, что мог.
0

Где имеет значение условия. Mysql любое число относится как значение TRUE и null или '' обрабатывается как FALSE.

1.SELECT * FROM tableName -- all record return
2.SELECT * FROM tableName WHERE 1 -- Return true value
3.SELECT * FROM tableName WHERE 123 -- Return true value 
4.SELECT * FROM tableName WHERE '2xyz' -- Return true value because there first character is number

5.SELECT * FROM tableName WHERE '' -- false value return
6.SELECT * FROM tableName WHERE 'xyz' -- false value return 
0

Это WHERE <condition>, например WHERE col1 = 123. Вместо этого у вас есть WHERE <number> или WHERE <string>, поэтому отсутствует выражение.

Что бы было возможно, хотя WHERE <boolean>, и это то, что ожидает MySQL. И поскольку MySQL обрабатывает логические значения, такие как числа (0 = false, другие числа = true), он ищет число.

  • 1 и 123 - это числа, которые приводят к истине.
  • '2xyz' преобразуется в 2, т.е. true.
  • '' и 'xyz' преобразуются в 0, т.е. false.

Таким образом, последний дает вам пустой набор результатов, поскольку условие where делает false.

  • 0
    Можете ли вы предоставить справочную документацию для поведения строковых литералов как булевых выражений (я не могу)?
  • 0
    Это неявное преобразование. Поскольку нет оператора сравнения, литерал должен представлять логическое значение. Строка, следовательно, преобразуется в логическое значение, то есть число :-)
Показать ещё 4 комментария
0

В выражении SELECT... WHERE [where_condition], в выражении where_condition вы можете использовать любую из функций и операторов, поддерживаемых MySQL, в которых также поддерживается строковый литерал. Для строк сравнения основаны на числовых значениях строкового блока. Также выполняется оценка преобразования типа выражения.

Таким образом, в приведенном выше случае 2xyz преобразуется в 2, что является true и, следовательно, вы получаете все записи. Это как

SELECT * FROM tableName WHERE 2

и строка xyz преобразуется в 0, что является false из-за чего вы получаете пустой набор результатов. Это то же самое, что:

SELECT * FROM tableName WHERE 0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню