我在SQL查询结果中提取子字符串时遇到问题。
以下是这种情况:我的列包含以下格式的字符串“ax123456uhba”,“ax54232hrg”,“ax274895rt”,“ax938477ed1”,“ax73662633wnn2”
我需要提取前面和后面跟着字母的数字字符串。但是,偶尔在尾随字符串中有一个我不需要的数字。尾随字符的长度不是静态的,所以我不能只做一个简单的子字符串函数。
我不一定要求填写完整的代码,如果可能的话,只是推动正确的方向。
提前感谢您的帮助。
答案 0 :(得分:3)
看起来PATINDEX就是你所需要的。
返回在字符串中找到的模式的第一个索引 - 期望正则表达式 看到这个 - > http://blog.sqlauthority.com/2007/05/13/sql-server-udf-function-to-parse-alphanumeric-characters-from-string/
这里是为了从字符串中删除字母数字字符而复制的代码 - 更改此代码以从字符串中删除第一个连续的数字系列不需要太长时间。
CREATE FUNCTION dbo.UDF_ParseAlphaChars
(
@string VARCHAR(8000)
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @IncorrectCharLoc SMALLINT
SET @IncorrectCharLoc = PATINDEX('%[^0-9A-Za-z]%', @string)
WHILE @IncorrectCharLoc > 0
BEGIN
SET @string = STUFF(@string, @IncorrectCharLoc, 1, '')
SET @IncorrectCharLoc = PATINDEX('%[^0-9A-Za-z]%', @string)
END
SET @string = @string
RETURN @string
END
GO
答案 1 :(得分:0)
如果您使用的是.NET,则可以使用正则表达式获取它:
var input = "ax938477ed1";
var reg = new Regex("[0-9]+");
var match = reg.Match(input);
int number = -1;
if (match.Success)
number = Convert.ToInt32(match.Groups[0].Value);
这将存储938477的数量。
答案 2 :(得分:0)
可能使用正则表达式是最简单的。
取决于数据库 - 有些具有正则表达式功能 - (SQL Server看起来可以添加到服务器Untested MSDN article
否则你可以使用like来减少查询。 Sybase允许x在'%[0-9]&'之类的地方使用要在其中查找带有数字的行,请在客户端中使用正则表达式。
答案 3 :(得分:0)
我同意使用RegEx,假设您使用的是SQL 2005或2008,您可以使用CLR。以下是一些在SQL Server中使用RegEx的UDF代码应该有用:
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Text
Imports System.Text.RegularExpressions
Imports Microsoft.SqlServer.Server
Partial Public Class UserDefinedFunctions
<Microsoft.SqlServer.Server.SqlFunction()>
Public Shared Function IsRegexMatch(ByVal input As SqlString, ByVal pattern As SqlString) As SqlBoolean
If input.IsNull OrElse pattern.IsNull Then Return SqlBoolean.Null
Return Regex.IsMatch(input.Value, pattern.Value, RegexOptions.IgnorePatternWhitespace Or RegexOptions.Singleline Or RegexOptions.Multiline)
End Function
<Microsoft.SqlServer.Server.SqlFunction()>
Public Shared Function RegexReplace(ByVal input As SqlString, ByVal pattern As SqlString, ByVal replacement As SqlString) As SqlString
If input.IsNull OrElse pattern.IsNull OrElse replacement.IsNull Then Return SqlString.Null
Return Regex.Replace(input.Value, pattern.Value, replacement.Value, RegexOptions.IgnorePatternWhitespace Or RegexOptions.Singleline Or RegexOptions.Multiline)
End Function
End Class