Другой подход для обработки этой текстовой манипуляции TSQL - PullRequest
0 голосов
/ 23 июля 2010

У меня есть следующие данные:

0297144600-4799               0297485500-5599

0297485500-5599, основанный на наблюдении всегда на позиции 31 символа слева, что является простым подходом.

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

0297144600-4799      0297485500-5599      0297485600-5699

Как вы можете видеть, я думаю, что первый подход будет разделять на 1 пробел (""), но из-за количества пробелов неизвестно (варьируется), как я тогда выберу этот подход? Есть ли способ найти пространство между ними и сжать в 1 пробел ("").

Кстати ... это нужно сделать на TSQL (MS SQL 2005), к сожалению, потому что это для SSIS :( ​​

Я открыт с вашей идеей / предложением.

Спасибо

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

Я немного обновил свой ответ, теперь, когда я знаю, что шаблон чисел не всегда совпадает.В этом коде предполагается, что последовательности начинаются и заканчиваются числом и разделяются любым количеством пробелов.

DECLARE @input nvarchar -- max in parens
DECLARE @pattern nvarchar -- max in parens
DECLARE @answer nvarchar -- max in parens
DECLARE @pos int
SET @input = '      0297144623423400-4799      5615618131201561561     0297485600-5699         '

-- Make sure our search string has whitespace at the end for our pattern to match
SET @input = @input + ' '

-- Find anything that starts and ends with a number
WHILE PATINDEX('%[0-9]%[0-9] %', @input) > 0
BEGIN
  -- Trim off the leading whitespace
  SET @input = LTRIM(@input)
  -- Find the end of the sequence by finding a space
  SET @pos = PATINDEX('% %', @input)
  -- Get the result out now that we know where it is
  SET @answer = SUBSTRING(@input, 0, @pos)
  SELECT [Result] = @answer
  -- Remove the result off the front of the string so we can continue parsing
  SET @input = SUBSTRING(@input, LEN(@answer) + 1, 8096)
END
1 голос
/ 23 июля 2010

Предполагая, что вы обрабатываете одну строку за раз, вы также можете попробовать это:

DECLARE @InputString nvarchar(max)
SET @InputString = '0297144600-4799      0297485500-5599      0297485600-5699'
BEGIN
WHILE CHARINDEX('  ',@InputString) > 0  -- Checking for double spaces
  SET @InputString =
    REPLACE(@InputString,'  ',' ') -- Replace 2 spaces with 1 space
END
PRINT @InputString

(взято непосредственно из SQLUSA , fnRemoveMultipleSpaces 1 )

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