Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск ошибки в строке  [new]
koly4ii86
Member

Откуда:
Сообщений: 18
Всем доброго времени суток!
Собственно дело такое: есть поле строкового типа (varchar), назовем его POLE. В него записывается информация, которую вносят юзеры в сторонней проге. Для этого поля есть правило (устное), что необходимо писать строку в формате '1,2,17' ну и т.д. То есть цифры обозначают некий код, если таких кодов несколько, то они должны быть разделены знаком ','.
Естественно юзверям устные правила не являются обязательными и в результате в это поле валятся всевозможные разделители типа: ' ,' '.' ',,' ' ', ну в общем всё что ни поподя.
Так вот, я хочу написать запрос, который выводит строку, в которой есть ошибка. Но как это сделать - ума не приложу. Всю голову сломал. Была мысль выловить возможные ошибки через LIKE либо POSITION, но всё это естественно лишь "заплатки", ибо всех возможных вариантов ошибок ручного ввода мне не перечислить.
Другая идея более правдоподобная: количество комбинаций кодов - неограниченно, все возможные правильные варианты не переберёшь, для дальнейшего сравнения с содержимым поля, но самих кодов число ограничено (42, пусть условно от '1' до '41').
И вот я хотел создать что-то вроде списка ENUM, в него записать все эти 42 кода, и написать запрос, в котором будет что-то вроде условия - "между элементами списка возможен только разделитель ',' если дугой, то ошибка" (вариант строки '1,5,' тоже ошибка). Но реализовать пока ни как не получается.
В общем вся надежда на помощь Ваших светлых голов, господа форумчане, хотя бы советом в какую сторону "копать" )))
26 апр 16, 11:25    [19106927]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
koly4ii86
"между элементами списка возможен только разделитель ','"

   POLE LIKE '%[^,0123456789]%'
OR POLE LIKE '%,,%'
OR POLE LIKE '%,'
OR POLE LIKE ',%'
26 апр 16, 11:34    [19106990]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
Как я понимаю, в значении допустим ограниченный набор символов - цифра, запятая, пробел. Кроме того, недопустима комбинация цифра-пробелы-цифра.
Не вижу проблемы в создании регулярного выражения, проверяющего соответствие такому шаблону...

koly4ii86
хочу написать запрос, который выводит строку, в которой есть ошибка.

Ну написал и вывел - что дальше?
Как я понимаю, задача-то - нормализовать значение, так? ну вот и решай сразу её...
26 апр 16, 11:35    [19107000]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
iap
koly4ii86
"между элементами списка возможен только разделитель ','"

   POLE LIKE '%[^,0123456789]%'
OR POLE LIKE '%,,%'
OR POLE LIKE '%,'
OR POLE LIKE ',%'
Ошибся...
NOT(POLE LIKE '%[^,0123456789]%'
 OR POLE LIKE '%,,%'
 OR POLE LIKE '%,'
 OR POLE LIKE ',%')
26 апр 16, 11:36    [19107008]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
koly4ii86
Member

Откуда:
Сообщений: 18
Akina
Как я понимаю, в значении допустим ограниченный набор символов - цифра, запятая, пробел. Кроме того, недопустима комбинация цифра-пробелы-цифра.
Не вижу проблемы в создании регулярного выражения, проверяющего соответствие такому шаблону...

Цифра, либо цифра-запятая-цифра... и т.д. Пробела быть не должно. И любых других комбинаций.
Ну если не видите - поделитесь, у меня вот проблемы...

koly4ii86
хочу написать запрос, который выводит строку, в которой есть ошибка.

Ну написал и вывел - что дальше?
Как я понимаю, задача-то - нормализовать значение, так? ну вот и решай сразу её...


Как раз-таки достаточно просто найти строки с ошибками. Остальное я уже придумал как сделаю.
26 апр 16, 11:46    [19107108]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
koly4ii86
Member

Откуда:
Сообщений: 18
iap, спасибо, сейчас посмотрю ))
26 апр 16, 11:47    [19107117]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
koly4ii86
Member

Откуда:
Сообщений: 18
Akina
Как я понимаю, в значении допустим ограниченный набор символов - цифра, запятая, пробел. Кроме того, недопустима комбинация цифра-пробелы-цифра.
Не вижу проблемы в создании регулярного выражения, проверяющего соответствие такому шаблону...


Цифра, либо цифра-запятая-цифра... и т.д. Пробела быть не должно. И любых других комбинаций.
Ну если не видите - поделитесь, у меня вот проблемы...
26 апр 16, 11:48    [19107122]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
koly4ii86
Пробела быть не должно.

Значит, 19107008.
26 апр 16, 12:09    [19107314]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
koly4ii86
Member

Откуда:
Сообщений: 18
iap, проверил Ваш вариант. Есть ньюансы, типа показывает некоторые правильные строки '32,35', и не показывает неправильные '5,', но принцип я понял, тут уж сам подкорректирую под своё условие! Спасибо за помощь!
26 апр 16, 14:03    [19108229]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21042
koly4ii86
не показывает неправильные '5,'

Третий шаблон из четырёх.
26 апр 16, 14:05    [19108246]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
Glory
Member

Откуда:
Сообщений: 104751
Парсите вашу строку по объявленному разделителю - ,
Каждый распарсенный итем просто проверяете на конвертацию в целое число.
26 апр 16, 14:15    [19108319]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
koly4ii86
iap, проверил Ваш вариант. Есть ньюансы, типа показывает некоторые правильные строки '32,35', и не показывает неправильные '5,', но принцип я понял, тут уж сам подкорректирую под своё условие! Спасибо за помощь!
Какой вариант из двух?
Если надо показать ошибки, то это первый (второй их, наоборот, отбрасывает).
Проверяем:
SELECT 'Error!' WHERE '32,35' LIKE '%[^,0123456789]%' OR '32,35' LIKE '%,,%' OR '32,35' LIKE '%,' OR '32,35' LIKE ',%';
Ничего не ворнулось, правильно?
SELECT 'Error!' WHERE '5б' LIKE '%[^,0123456789]%' OR '5,' LIKE '%,,%' OR '5,' LIKE '%,' OR '5,' LIKE ',%';
Видим сообщение об ошибке.
Что не так?
26 апр 16, 14:21    [19108358]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
koly4ii86
Member

Откуда:
Сообщений: 18
iap, ага, по началу не так понял. Всё работает, спасибо! )))
28 апр 16, 13:29    [19117274]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в строке  [new]
koly4ii86
Member

Откуда:
Сообщений: 18
Glory, спасибо за совет, должно сработать! Обязательно попробую.
28 апр 16, 13:35    [19117309]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить