从sql查询中的行中选择一个特定的数字

时间:2013-12-29 06:05:38

标签: sql sql-server sql-server-2008 tsql

我想仅为" 09xxxxxxxxx"选择一个SQL查询。从下表:

021-77083709 - 09125800327

09123301673 22514057

09121964217 09332712035

它可能在行的任何地方,我想选择这些数字。这意味着" 09"之后+9个字符。

例如在开销行中,选择以下数字:

09125800327

09123301673

09121964217

09332712035

我的表 http://upload.tehran98.com/upme/uploads/33a59e81d6d51d311.jpg

由于

1 个答案:

答案 0 :(得分:1)

这将让你成为那里的一部分......

SELECT  SUBSTRING(tbl.columnName,
                  PATINDEX('%09[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',
                           tbl.ColumnName), 11) FirstOccurrance
FROM    TableName tbl
WHERE   tbl.columnName LIKE '%09[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'

这只会提取列中第一次出现的模式, 模式匹配也非常有限。

顺便提一句,你的例子是09 + 9个字符而不是10个

这是一个函数,可用于将列中的所有匹配值提取为csv字符串

CREATE FUNCTION dbo.FilterValues
    (
      @OriginalValue NVARCHAR(2000)
    )
RETURNS NVARCHAR(2000)
AS 
    BEGIN
        DECLARE @IDX INT = PATINDEX('%09[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',
                                    @OriginalValue);
        DECLARE @Temp NVARCHAR(4000) = @OriginalValue;
        DECLARE @Result NVARCHAR(4000) = '';

        WHILE ( @IDX IS NOT NULL
                AND @IDX > 0
              ) 
            BEGIN
                SET @Result = @Result + SUBSTRING(@Temp, @IDX, 11);
                SET @Temp = SUBSTRING(@Temp, @IDX + 11, LEN(@Temp) - 11);
                SET @IDX = PATINDEX('%09[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',
                                    @Temp);
                IF ( @IDX IS NOT NULL
                     AND @IDX > 0
                   ) 
                    BEGIN
                        SET @Result = @Result + ',';
                    END

            END

        RETURN @Result;
    END

以下是如何将查询与函数

一起使用的示例
SELECT  dbo.FilterValues(tbl.ColumnName) MatchedValues
FROM    TableName tbl
WHERE   tbl.columnName LIKE '%09[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'