Подстрока SQL Extract - PullRequest
       5

Подстрока SQL Extract

0 голосов
/ 30 октября 2009

У меня проблема с извлечением подстроки в результатах SQL-запроса.

Вот ситуация: у меня есть столбец, содержащий строки в следующем формате: «ax123456uhba», «ax54232hrg», «ax274895rt», «ax938477ed1», «ax73662633wnn2»

Мне нужно извлечь числовую строку, которая предшествует и сопровождается буквами. Однако иногда в конце строки есть номер, который мне не нужен. Длина завершающих символов не является статической, поэтому я не могу просто выполнить простую функцию подстроки.

Я не обязательно прошу завершенный код, просто полезный толчок в правильном направлении, если это возможно.

Заранее спасибо за помощь.

Ответы [ 4 ]

3 голосов
/ 30 октября 2009

Похоже, что 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
0 голосов
/ 09 июля 2010

Я согласен с использованием RegEx для этого, предполагая, что вы находитесь на SQL 2005 или 2008, где вы можете использовать CLR. Вот некоторый код UDF для использования RegEx в SQL Server, который должен быть полезным:

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
0 голосов
/ 30 октября 2009

Вероятно, использовать регулярное выражение будет проще всего.

Зависит от базы данных - некоторые имеют функции регулярных выражений - (SQL Server выглядит так, как будто его можно добавить на сервер Не проверенная статья MSDN

В противном случае вы можете сократить запрос, используя лайк. Sybase позволяет, где x, например, «% [0-9] &», находить строки с числом в них, а затем использовать регулярное выражение в клиенте.

0 голосов
/ 30 октября 2009

Если вы используете .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 номер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...