Тестирование строки на наличие только цифр в SQL Server

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того, чтобы быстро установить, состоит ли строка только из цифр в SQL Server, используйте оператор LIKE с паттерном '%[^0-9]%'. Это поможет выявить любое присутствие не числовых символов. Вот пример базового использования:

SQL
Скопировать код
DECLARE @TestString VARCHAR(100) = '12345'; -- Поменяйте на '123abc', чтобы проверить наличие букв.
IF @TestString NOT LIKE '%[^0-9]%'
    PRINT 'Только цифры'; -- По аналогии с математическим учебником для начальной школы!
ELSE
    PRINT 'Содержит не только цифры'; -- Нечто в роде числа Пи, но с буквами.

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

Кинга Идем в IT: пошаговый план для смены профессии

Глубокое погружение: что стоит за проверкой символов

Проблемы с ISNUMERIC

Вначале может показаться, что ISNUMERIC идеально подходит для исследования, но функция может обмануть нас. Она считает числами строки с валютными обозначениями, плюсами +, минусами - и точками (используемыми как десятичные разделители). Это приводит к ложноположительным срабатываниям. Пример:

SQL
Скопировать код
SELECT ISNUMERIC('$123'), ISNUMERIC('-123'), ISNUMERIC('123.45');
-- Результат: 1, 1, 1 (Итак, что-то здесь не так!)

Это не подходит под наши условия, так как мы ищем строки, представляющие собой только цифры.

Настройка обработки пустых строк и пробелов: добавление точности

Использование NOT LIKE совместно с проверкой на пустую строку и пробелы поможет уточнить результаты. Это как помощник Бэтмена, который приходит нам на помощь:

SQL
Скопировать код
IF LEN(@TestString) > 0 AND @TestString NOT LIKE '%[^0-9]%' AND @TestString NOT LIKE '%[ ]%'
    PRINT 'Только цифры и нет пробелов'; -- Как книга, где лишь номера страниц.
ELSE
    PRINT 'Есть и другие символы или пробелы'; -- Это добавляет загадочности.

Такой подход исключает редкие случаи, когда строки могут остаться не замеченными.

Визуализация

Представьте себя великим наблюдателем в духе Шерлока Холмса (SQL-запрос), который находится на тропе злодея (строка), у которого вместо пальцев только цифры (строка из цифр). Ваша задача:

SQL
Скопировать код
IF ЗЛОДЕЙ IS_DIGIT() = TRUE, Шерлок заявляет: "Элементарно, Ватсон! 🚨"
ELSE "Игра не закончена! 🕵️‍♂️ Продолжаем искать."

Перефразируем это в терминах T-SQL:

SQL
Скопировать код
SELECT CASE WHEN SUSPECT NOT LIKE '%[^0-9]%' THEN '🚨 Элементарно, все цифры на месте!' 
            ELSE '🕵️‍♂️ Обнаружены нецифровые символы. Игра продолжается.' END

Продвинутые методы: запросы на высоте с помощью альтернативных инструментов

Изучение PATINDEX

Не только LIKE может стать вашим парнером в поисках, также существует PATINDEX. Вот демонстрация его использования:

SQL
Скопировать код
IF PATINDEX('%[^0-9]%', @TestString) = 0
    PRINT 'Только цифры'; -- Разрешили тайну числовой последовательности!
ELSE
    PRINT 'Обнаружены также и другие символы'; -- Вернемся к расследованию, мой дорогой Ватсон!

Изощренность T-SQL: запросы с использованием шаблонов

С помощью T-SQL возможна проведение детальной проверки по шаблону, что позволяет:

SQL
Скопировать код
SELECT IIF(SUM(CASE WHEN SUBSTRING(@TestString, v.number, 1) LIKE '[0-9]' THEN 0 ELSE 1 END) = 0, 
           'Только цифры', 
           'Содержит также и другие символы')
FROM master.dbo.spt_values v
WHERE v.type = 'P' AND v.number BETWEEN 1 AND LEN(@TestString);
-- Когда необходимо до конца проверить каждый элемент, мы не согласимся с приближенными результатами.

Любопытный момент этого подхода в том, что он использует системную таблицу для буквального анализа строки.

Числа и культурный контекст: иллюзия простоты

В разных культурах числа могут быть представлены по-разному, с использованием точки (.) или запятой (,) в роли десятичного или тысячного разделителей. При проверке на "только цифры" такие символы следует признавать нарушителями порядка, так же как и все остальные нецифровые символы.

Полезные материалы

  1. PATINDEX (Transact-SQL) – SQL Server | Microsoft Learnосновной справочник для изучения PATINDEX.
  2. Java String – See if a string contains only numbers and not letters – Stack Overflow — обсуждения о проверке на числа в мире Java.
  3. SQL Server: LIKE Condition — полное описание использования LIKE.
  4. PowerShell and ADO.NET Connection String Settings for SQL Server — исследуйте возможности DataTable.
  5. SQL Tutorial — надежный помощник в мире SQL.