【问题标题】:SQL Extract substringSQL 提取子字符串
【发布时间】:2009-10-30 16:25:11
【问题描述】:

我在提取 SQL 查询结果中的子字符串时遇到问题。

情况如下:我有一列包含以下格式的字符串“ax123456uhba”、“ax54232hrg”、“ax274895rt”、“ax938477ed1”、“ax73662633wnn2”

我需要提取字母前后的数字字符串。但是,有时在尾随字符串中有一个我不需要的数字。尾随字符的长度不是静态的,所以我不能只做一个简单的子字符串函数。

我不一定要求完整的代码,如果可能的话,只是朝着正确的方向推进。

提前感谢您的帮助。

【问题讨论】:

  • 您是用 SQL 还是 .NET 处理这个子字符串?
  • 现在使用 SQL。 .NET 并没有超出可能的范围。

标签: .net sql string


【解决方案1】:

看起来 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

【讨论】:

  • 很好的发现!谢谢一百万!
  • 为了记录,这个UDF将删除所有字母。它会将“a9d1”翻译成 91。
【解决方案2】:

如果您使用的是 .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。

【讨论】:

    【解决方案3】:

    可能使用正则表达式是最简单的。

    取决于数据库-有些有正则表达式功能-(SQL Server看起来可以添加到服务器Untested MSDN article

    否则你可以使用like来减少查询。 Sybase 允许 where x like '%[0-9]&' 查找其中包含数字的行,然后在客户端中使用正则表达式。

    【讨论】:

      【解决方案4】:

      我同意为此使用 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
      

      【讨论】:

        猜你喜欢
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 2019-12-21
        • 2013-11-19
        • 1970-01-01
        • 2016-11-24
        • 2019-02-08
        • 2023-03-14
        相关资源
        最近更新 更多