处理此TSQL文本操作的其他方法

时间:2010-07-22 23:54:46

标签: sql-server-2005 tsql

我有以下数据:

0297144600-4799               0297485500-5599

0297485500-5599基于观察总是在左边的31号角上,这是一个简单的方法。

但我想做的是预测以下数据如下所示,这意味着该职位不再有效:

0297144600-4799      0297485500-5599      0297485600-5699

正如你所看到的,我猜第一种方法是将1个空格分开(“”)但是由于空间数量未知(变化),我该如何采用这种方法呢?有没有找到空间的方法,缩小到1个空格(“”)。

BTW ......它需要在TSQL(Ms SQL 2005)中完成,不幸的是它导致了SSIS :(

我对你的想法/建议持开放态度。

由于

2 个答案:

答案 0 :(得分:2)

我已经更新了我的答案,现在我知道数字模式并不总是匹配。此代码假定序列将以数字开头和结尾,并以任意数量的空格分隔。

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 :(得分:1)

假设您一次处理一行,您也可以尝试:

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