T-SQL, Найти числовые значения

Вопрос:Я сделал эту викторину на http://www.sql-ex.ru/, вопрос 35, если быть точным. Вопрос заключается в следующем: В таблице Product определите модели, которые состоят только из цифр или только латинских букв (A-Z, без учета регистра). Набор результатов: модель, тип модели. И я дал правильный ответ: SELECT model, type FROM Product WHERE Model NOT LIKE '%[^A-Z]%' OR Model

Вопрос:

Я сделал эту викторину на 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))

Оцените статью
Добавить комментарий