Извлечь число из строки в SQL - PullRequest
2 голосов
/ 05 августа 2011

У меня есть следующая строка:

"FLEETWOOD DESIGNS 535353110XXXXX" (на самом деле X - это цифры, которые я просто хотел скрыть здесь)

Кто-нибудь знает, как я могу искать в строках в SQL и извлекать числа, которые больше, чем, скажем, 10 символов в длину?

Ответы [ 4 ]

1 голос
/ 12 июля 2012

Это довольно старый пост, но может помочь кому-либо еще. Я искал определенную пользователем функцию в SQL Server, чтобы извлечь только числа данной строки, и, к удивлению, я не смог найти именно то, что искал.

Позвольте мне привести здесь код функции «Извлечение числа из строки в SQL» (действительно для SQL Server). Это взято из фантастического блога Пинал Дэйв , я изменил его просто для того, чтобы вернуть NULL, если значение NULL передано функции.

CREATE FUNCTION [dbo].[ExtractInteger](@String VARCHAR(2000))
    RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE @Count INT
    DECLARE @IntNumbers VARCHAR(1000)
    SET @Count = 0
    SET @IntNumbers = ''

    IF @String IS NULL
        RETURN NULL;

    WHILE @Count <= LEN(@String)
    BEGIN
        IF SUBSTRING(@String,@Count,1) >= '0' AND SUBSTRING(@String,@Count,1) <= '9'
        BEGIN
            SET @IntNumbers = @IntNumbers + SUBSTRING(@String,@Count,1)
        END
        SET @Count = @Count + 1
    END

    RETURN @IntNumbers
END

Тесты

select '"' + dbo.ExtractInteger('1a2b3c4d5e6f7g8h9i') + '"'
GO
select '"' + dbo.ExtractInteger('abcdefghi') + '"'
GO
select '"' + dbo.ExtractInteger(NULL) + '"'
GO
select '"' + dbo.ExtractInteger('') + '"'
GO

Результаты

"123456789"
""
NULL
""
0 голосов
/ 07 августа 2012

Это можно сделать вот так

Declare @X     varchar(100)
Select     @X=    'Here is where15234Numbers'
--
Select     @X=    SubString(@X,PATINDEX('%[0-9]%',@X),Len(@X))
Select     @X=    SubString(@X,0,PATINDEX('%[^0-9]%',@X))
--// show result 
Select     @X
0 голосов
/ 05 августа 2011

Вы не упоминаете движок БД, поэтому мы не знаем, какие функции доступны ...

Если доступны регулярные выражения, то шаблон типа \d{10,} будет соответствовать числам с 10 или более цифрами.

В mySQL REGEXP может возвращать только true или false (0 или 1), поэтому вам придется использовать некрасивый хак, например

SELECT
  LEAST(
     INSTR(field,'0'),
     INSTR(field,'1'),
     INSTR(field,'2'),
     INSTR(field,'3'),
     INSTR(field,'4'),
     INSTR(field,'5'),
     INSTR(field,'6'),
     INSTR(field,'7'),
     INSTR(field,'8'),
     INSTR(field,'9')
  ) AS startPos,
  REVERSE(field) AS backward,
  LEAST(
     INSTR(backward,'0'),
     INSTR(backward,'1'),
     INSTR(backward,'2'),
     INSTR(backward,'3'),
     INSTR(backward,'4'),
     INSTR(backward,'5'),
     INSTR(backward,'6'),
     INSTR(backward,'7'),
     INSTR(backward,'8'),
     INSTR(backward,'9')
  ) AS endPos,
  SUBSTRING(field, startPos, endPos - startPos + 1)
FROM tab
WHERE(field REGEXP '[0-9]{10,}')

, но это не такt идеально - он извлечет ложную подстроку для строки типа «ABC 9 A 1234567891», не говоря уже о том, что она, вероятно, настолько медленная, что быстрее обрабатывает данные вручную.

0 голосов
/ 05 августа 2011
SUBSTRING('FLEETWOOD DESIGNS 535353110XXXXX', 18, 32)

Вы также можете использовать LEN(), чтобы получить длину самой строки. Если вы знаете длину серийного номера, вы можете просто вычесть ее из конечного индекса, чтобы получить начальный индекс подстроки.

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