SQL Server извлекает только данные после = ИЛИ только цифры - PullRequest
0 голосов
/ 16 октября 2018

Кажется, что регулярное выражение было бы идеальным, но некоторые члены команды не любят регулярные выражения ...

Проблема: данные в столбце (из импорта плоских файлов мэйнфреймов) выглядят как 2 разных способа

BreakID = 83823737237
OR
MFR BreakID=482883 

Таким образом, различия - это пробел перед цифрами, длина буквенных символов до равенства и, наконец, длина чисел будет меняться.

Кажется, у меня есть несколько подходов
1. Все после знака = и обрезка?2. regex, получить только цифры?

Итак, я нашел этот код, в котором я предполагаю, что PATINDEX является стандартным способом выполнения регулярных выражений в -tsql?что такое "строка" в этом?

SELECT SUBSTRING(string, PATINDEX('%[0-9]%', string), PATINDEX('%[0-9][^0-9]%', string + 't') - PATINDEX('%[0-9]%', 
                string) + 1) AS Number

Как это можно решить с помощью лучших практик?

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Кайдзен: перейдите к простому, а не идеальному решению

SELECT substring(c, charindex('=', c), 999)

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

Если он идет в столбце строки, то оберните его в ltrim()

Теперь к вашим вопросам

1 .. trim

Конечно, как указано выше

2 regex ...

Не реализовано в sqlserver, если вы не используетеCLR

PATINDEX ...

Это похоже на регулярное выражение, но это очень ограниченное подмножество, которое выполняет только поиск, возвращает только один строковый индекс, не захватывает, ограничено/ нет классов персонажей.Это больше похоже на подстановочные знаки dos / vb6, чем на регулярные выражения

... лучшая практика?

Посмотрите на это просто;Вы получаете часть строки после =, не приземляясь на Луну.лучшее решение для незначительных оптимизаций, подобных этим, это то, которое требует наименьшего количества умственных усилий от следующего человека, который возьмет на себя вашу работу, чтобы справиться с этим (он все еще будет использоваться через 20 лет) :)

0 голосов
/ 16 октября 2018

Немного другой ответ, чем у scsimon.Я обычно иду по этому пути, когда мне нужно захватить значения в конце строки.Вы переворачиваете строку и захватываете позицию первого экземпляра значения вашего ключа (в данном случае '=').Получите эту позицию с помощью charindex, а затем возьмите символы RIGHT (), используя это значение charindex.

DECLARE @val1 VARCHAR(100) = 'BreakID = 83823737237'
DECLARE @val2 VARCHAR(100) = 'MFR BreakID=482883'

SELECT 
LTRIM(RTRIM(RIGHT(@val1, CHARINDEX('=', REVERSE(@val1), 0)-1)))
,LTRIM(RTRIM(RIGHT(@val2, CHARINDEX('=', REVERSE(@val2), 0)-1)))

Это решение будет хорошо работать, если у вас есть странные случаи, например, если у вас есть компания с именем SQL=Cool вваши данные, и ему нужен идентификатор:

'SQL=CoolID = 12345'

, и вы все еще хотите получить 12345.

0 голосов
/ 16 октября 2018

Это решение хорошее и универсальное, хотя звучит так, что ваша строка всегда будет иметь =, поэтому вы можете написать что-то более конкретное, если хотите.

Это решение находит начальное местоположениепервая числовая строка:

PATINDEX('%[0-9]%', string)

И находит расположение первого нечислового символа после этой числовой строки (добавляя 't' к концу строки, если она заканчивается числом, котороев противном случае выдает ошибку):

PATINDEX('%[0-9][^0-9]%', string + 't')

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

SELECT SUBSTRING(string, PATINDEX('%[0-9]%', string), PATINDEX('%[0-9][^0-9]%', string + 't') - PATINDEX('%[0-9]%', 
                string) + 1) AS Number

Здесь "строка" - это заполнитель, который должен быть заменен именем вашего столбца.Кроме того, самый простой способ проверить подобные вещи в tsql - это использовать переменную:

DECLARE @string varchar(100) = 'foo bar la la la 83823737237'

SELECT SUBSTRING(@string, PATINDEX('%[0-9]%', @string), PATINDEX('%[0-9][^0-9]%', @string + 't') - PATINDEX('%[0-9]%', 
                @string) + 1) AS Number

Вывод:

83823737237
0 голосов
/ 16 октября 2018

Похоже на хороший вариант использования для substring и replace с charindex

Мы берем подстроку из всего, начиная с первого значения после = до 99 цифр (или каксколько угодно хочешь войти).Мы используем replace, чтобы избавиться от ведущего пространства, если оно есть.

select replace(substring(stringColumn,charindex('=',stringColumn) + 1,99),' ','')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...