sql >> Databáze >  >> RDS >> Sqlserver

Extrahujte čísla z textu na SQL Server

Tohle je trochu kratší. Přeměnil to na funkci Inline Table, která k nalezení čísel používá rekurzivní CTE.

create function [dbo].[GetNumbersFromText](@String varchar(2000))
returns table as return
(
  with C as
  (
    select cast(substring(S.Value, S1.Pos, S2.L) as int) as Number,
           stuff(s.Value, 1, S1.Pos + S2.L, '') as Value
    from (select @String+' ') as S(Value)
      cross apply (select patindex('%[0-9]%', S.Value)) as S1(Pos)
      cross apply (select patindex('%[^0-9]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L)
    union all
    select cast(substring(S.Value, S1.Pos, S2.L) as int),
           stuff(S.Value, 1, S1.Pos + S2.L, '')
    from C as S
      cross apply (select patindex('%[0-9]%', S.Value)) as S1(Pos)
      cross apply (select patindex('%[^0-9]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L)
    where patindex('%[0-9]%', S.Value) > 0
  )
  select Number
  from C
)

Pokud očekáváte, že řetězec bude mít více než 100 čísel, musíte jej zavolat pomocí option (maxrecursion 0) .

declare @S varchar(max)
set @S = 'Give me 120 this week and 50 next week'
select number from GetNumbersFromText(@S) option (maxrecursion 0)


  1. Rails:PG::InsufficientPrivilege:ERROR:povolení odepřeno pro vztah schema_migrations

  2. Jak vytvořit zobrazení s více výběrovými dotazy, které vrátí více řádků v oracle?

  3. Jak naplánovat mysql uloženou proceduru ve Windows?

  4. Jak vytvořit databázi ze šablony v Accessu 2016