我想仅为" 09xxxxxxxxx"选择一个SQL查询。从下表:
021-77083709 - 09125800327
09123301673 22514057
09121964217 09332712035
它可能在行的任何地方,我想选择这些数字。这意味着" 09"之后+9个字符。
例如在开销行中,选择以下数字:
09125800327
09123301673
09121964217
09332712035
我的表 http://upload.tehran98.com/upme/uploads/33a59e81d6d51d311.jpg
由于
答案 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]%'