Вопрос:
Я сделал эту викторину на http://www.sql-ex.ru/, вопрос 35, если быть точным.
Вопрос заключается в следующем:
В таблице Product определите модели, которые состоят только из цифр или только латинских букв (A-Z, без учета регистра).
Набор результатов: модель, тип модели.
И я дал правильный ответ:
SELECT model, type FROM Product WHERE Model NOT LIKE ‘%[^A-Z]%’ OR Model NOT LIKE ‘%[^0-9]%’
Теперь мой вопрос, почему мне нужно двойное отрицание, чтобы заставить его работать.
Если я переписал код на:
SELECT model, type FROM Product WHERE Model LIKE ‘%[A-Z]%’ OR Model LIKE ‘%[0-9]%’
Я получаю неправильный ответ:
Ваш запрос вернул правильный набор данных в первую (доступную) базу данных, но он вернул неверный набор данных во вторую контрольную базу данных.
* Неверное количество записей (больше на 37)
Как получилось, что первый пример кода дает правильный ответ, а второй пример не работает?
Я пытался найти ответ, но не повезло. Благодарен за объяснение.
Лучший ответ: Where Model LIKE ‘%[A-Z]%’ Or Model LIKE ‘%[0-9]%’
Соответствует строкам, где Model содержит хотя бы один буквенно-цифровой символ.
Это никоим образом не исключает те значения, которые содержат смешанные буквенно-цифровые и не буквенно-цифровые символы.
например. ~A#- будет проходить из-за наличия A
Кроме того, ваш правильный запрос соответствует
- ‘%[^A-Z]%’: те строки, которые не содержат никаких букв (т.е. состоят только из букв или пусты)
- ‘%[^0-9]%’: те строки, которые не содержат никаких цифр (т.е. состоят только из цифр или пусты).
Это не обрабатывается во второй попытке, и смешанная строка букв и цифр будет принята этим.
Я бы использовал вашу первую попытку, но если бы вы решили избежать двойного отрицания, вы могли бы использовать
SELECT model FROM Product WHERE Model LIKE REPLICATE(‘[A-Z]’, LEN(Model)) OR Model LIKE REPLICATE(‘[0-9]’, LEN(Model))