Работа со строками T-SQL, замена, сравнение, сопоставление с образцом, регулярные выражения - PullRequest
1 голос
/ 16 ноября 2011

У меня есть короткая строка буквенно-цифровых символов A-Z и 0-9

В строку включены оба символа и цифры.

Я хочу убрать пробелы и сравнить каждую строку с «шаблоном», из которого она будет соответствовать только одному. Образцы используют A для обозначения любого символа A-Z и 9 для любого 0-9.

6 моделей:

A99AA
A999AA
A9A9AA
AA99AA
AA999AA
AA9A9AA

У меня есть это в таблице с другим столбцом, с правильным местом на месте: -

pattern PatternTrimmed
A9 9AA  A99AA
A99 9AA A999AA
A9A 9AA A9A9AA
AA9 9AA AA99AA
AA99 9AA    AA999AA
AA9A 9AA    AA9A9AA

Я использую SQL Server 2005, и я не хочу, чтобы 34 оператора замены заменяли каждый из символов и цифр на A и 9.

Предложения о том, как я могу добиться этого кратким, кратким способом, пожалуйста.

Вот чего я хочу избежать: -

update postcodes set Pattern = replace (Pattern, 'B', 'A') 
update postcodes set Pattern = replace (Pattern, 'C', 'A') 
update postcodes set Pattern = replace (Pattern, 'D', 'A') 
update postcodes set Pattern = replace (Pattern, 'E', 'A')

и т.д.

и

update postcodes set Pattern = replace (Pattern, '0', '9') 
update postcodes set Pattern = replace (Pattern, '1', '9')
update postcodes set Pattern = replace (Pattern, '2', '9')

и т.д.

По сути, я пытаюсь взять почтовый индекс Великобритании, набранный в колл-центре с помощью имбецила, и шаблон сопоставляет введенный почтовый индекс с одним из 6 вышеприведенных шаблонов и выясняет, где вставить пробел.

1 Ответ

1 голос
/ 16 ноября 2011

Как насчет этого:

 Declare @table table
(
ColumnToCompare varchar(20),
AmendedValue varchar(20)
)

Declare @patterns table
(
Pattern varchar(20),
TrimmedPattern varchar(20)
)

Insert Into @table (ColumnToCompare)
Select 'BBB87 BBB'
Union all
Select 'J97B B'
union all
select '282 8289'
union all
select 'UW83 7YY'
union all
select 'UW83 7Y0'

Insert Into @patterns
Select 'A9 9AA', 'A99AA'
union all
Select 'A99 9AA', 'A999AA'
union all
Select 'A9A 9AA', 'A9A9AA'
union all
Select 'AA9 9AA', 'AA99AA'
union all
Select 'AA99 9AA', 'AA999AA'
union all
Select 'AA9A 9AA', 'AA9A9AA'


Update @table
Set AmendedValue =  Left(Replace(ColumnToCompare, ' ',''), (CharIndex(' ', Pattern)-1)) + space(1) + 
                    SubString(Replace(ColumnToCompare, ' ',''), (CharIndex(' ', Pattern)), (Len(ColumnToCompare) - (CharIndex(' ', Pattern)-1)))
From @table
Cross Join @Patterns
Where PatIndex(Replace((Replace(TrimmedPattern, 'A','[A-Z]')), '9','[0-9]'), Replace(ColumnToCompare, ' ' ,'')) > 0

select * From @table

Эта часть

Left(Replace(ColumnToCompare, ' ',''), (CharIndex(' ', Pattern)-1))

находит пространство в сопоставленном шаблоне и берет левую рукучасть сравниваемой строки.

затем добавляется пробел

+ space(1) +

, затем эта часть

SubString(Replace(ColumnToCompare, ' ',''), (CharIndex(' ', Pattern)), (Len(ColumnToCompare) - (CharIndex(' ', Pattern)-1)))

добавляет остаток строки к новому значению.

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