Функция SQL, извлечь числа до - - PullRequest
1 голос
/ 18 июля 2010

Я играю с созданием функции sql, которая будет извлекать числа из заголовка, что и делает следующий код ниже. Хотя, я хочу изменить эту функцию для разбора номеров на разделы. Например:

Текущие данные в поле заголовка:

QW 1 RT 309-23-1
QW 1 RT 29-1
QW 1 RT 750-1
QW RT 750-1

Временные таблицы, созданные после запуска функции в поле заголовка:

column 1  Column 2  Column 3  Column 4
1         309       23        1
1         29        1         Null
1         750       1         Null
Null      750       1         Null

create function [dbo].[ExtractNumbers](@Numbers nvarchar(2000))  
returns nvarchar(2000)  
as 
BEGIN 
  declare @NonNumericIndex int  
  set @NonNumericIndex = PATINDEX('%[^0-9]%',@Numbers)  

  WHILE @NonNumericIndex > 0  
  begin 
    SET @Numbers = REPLACE(@Numbers,SUBSTRING(@Numbers,@NonNumericIndex,1),'')  
    SET @NonNumericIndex = PATINDEX('%[^0-9]%',@Numbers)  
    SET 
  end 

  return @Numbers  
END 

1 Ответ

0 голосов
/ 19 июля 2010

Вот один из способов.

Хотя на самом деле в конце я понял, что формат был более фиксированным, чем я предполагал изначально, так что вам может быть лучше, просто используя различные функции обработки строк для непосредственного вычисления столбцов.* Использует следующий TVF

CREATE FUNCTION GetNumbers 
(
@Numbers NVARCHAR(2000) 
)
RETURNS @Results TABLE 
(
idx INT IDENTITY(1,1),
num INT
) 
AS
BEGIN
    DECLARE @NonNumericIndex INT,  @NumericIndex INT

    SET @NumericIndex = PATINDEX('%[0-9]%',@Numbers)

    IF (@NumericIndex > 4) --First Column not there
          INSERT INTO @Results VALUES (NULL)

    WHILE @NumericIndex > 0
    BEGIN
        SET @Numbers = RIGHT(@Numbers,LEN(@Numbers)-@NumericIndex+1)

        SET @NonNumericIndex = PATINDEX('%[^0-9]%',@Numbers)

        IF(@NonNumericIndex = 0)
        BEGIN
            INSERT
            INTO @Results VALUES (@Numbers)
            RETURN
        END
        ELSE
        INSERT
        INTO @Results VALUES
            (LEFT(@Numbers,@NonNumericIndex-1))

        SET @Numbers = RIGHT(@Numbers,LEN(@Numbers)-@NonNumericIndex+1)
        SET @NumericIndex = PATINDEX('%[0-9]%',@Numbers)
    END
    RETURN
END
...