Выражение регулярного выражения в MS SQL - PullRequest
1 голос
/ 10 марта 2010

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

Данные в таблицах выглядят как

create table #tempTBL (opis varchar(40))
go
insert into #tempTBL
select 'C 136'
union 
select 'C 145'
union 
select 'C146'
union 
select 'AK C 182'
union 
select 'C  277'
union 
select 'C-240'
union 
select 'ISPRAVKA PO C 241'

И выберите жало выглядит как

Select 
     reverse(
            rtrim(
                    ltrim(
                            replace(
                                    (substring
                                            (reverse(opis)
                                                    ,0
                                                    ,charindex(
                                                                'C',reverse(opis)
                                                               )
                                            )
                                      )
                            ,'-',' ')
                          )
                  )
            ) as jci
from #tempTBL

Как должен выглядеть мой код C #, чтобы я повторил это с помощью регулярного выражения

Ответы [ 3 ]

1 голос
/ 10 марта 2010

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

Есть много примеров, но эта статья так же хороша, как и любая другая

EDIT Если ваш пример охватывает весь диапазон возможных конфигураций ваших данных, вам может понадобиться регулярное выражение, например (\d+) (означающее одну или несколько последовательных цифр, возвращаемых в качестве группы совпадений).

1 голос
/ 11 марта 2010

Использование регулярных выражений CLR может быть довольно медленным. Если преобразование так же просто, как в примере, вам лучше использовать простой SQL.

Посмотрите на функцию PATINDEX, это может быть полезно. Кроме того, я бы предложил инкапсулировать извлечение в UDF для ясности.

create function dbo.ParseNum(@s varchar(40)) returns char(3)
as begin
    declare @n int
    set @s = replace(replace(@s, '-', ''), ' ', '')
    set @n = patindex('%C[0-9][0-9][0-9]', @s)
    if @n = 0 return null
    return substring(@s, @n+1, 3)
end
go

select opis, dbo.ParseNum(opis) from #tempTBL 
1 голос
/ 10 марта 2010

См. статью . Он просто добавляет функцию .NET в sqlserver и затем вызывает ее как функцию sqlserver в вашем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...