Отладка бездействующего запроса postgres, выполненного из sqlalchemy

Вот версия, которая вытягивает все цифры из строки; то есть I'm 35 years old; I was born in 1982. The average family has 2.4 children. это вернет 35198224. т.е. хорошо, когда у вас есть числовые данные, которые могут быть отформатированы как код (например, #123,456,789 / 123-00005), но не подходит, если вы хотите вытащить определенные числа (т. е. в отличие от цифр / только числовые символы) из текста. Также он обрабатывает только цифры; так что не будет возвращать отрицательные знаки (-) или периоды .).

declare @table table (id bigint not null identity (1,1), data nvarchar(max)) 
insert @table (data) 
values ('hello 123 its 45613 then') --outputs: 12345613
,('1 some other string 98 example 4') --outputs: 1984
,('AB ABCDE # 123') --outputs: 123 
,('ABCDE# 123') --outputs: 123
,('AB: ABC# 123') --outputs: 123
; with NonNumerics as (
    select id
    , data original
    --the below line replaces all digits with blanks
    , replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(data,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9','') nonNumeric
    from @table
)
--each iteration of the below CTE removes another non-numeric character from the original string, putting the result into the numerics column
, Numerics as (
    select id
    , replace(original, substring(nonNumeric,1,1), '') numerics
    , replace(nonNumeric, substring(nonNumeric,1,1), '') charsToreplace
    , len(replace(nonNumeric, substring(nonNumeric,1,1), '')) charsRemaining
    from NonNumerics

    union all

    select id
    , replace(numerics, substring(charsToreplace,1,1), '') numerics
    , replace(charsToreplace, substring(charsToreplace,1,1), '') charsToreplace
    , len(replace(charsToreplace, substring(charsToreplace,1,1), '')) charsRemaining
    from Numerics
    where charsRemaining > 0
)
--we select only those strings with `charsRemaining=0`; i.e. the rows for which all non-numeric characters have been removed; there should be 1 row returned for every 1 row in the original data set.
select * from Numerics where charsRemaining = 0

Этот код работает, удаляя все цифры (то есть символы, которые нам нужны) из заданных строк заменяя их пробелами. Затем он проходит через исходную строку (включая цифры), удаляя все оставшиеся символы (то есть нечисловые символы), оставляя только цифры.

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

В методе используется рекурсивный SQL, используя общие табличные выражения (CTE).

0
задан Kurt Spindler 25 February 2015 в 17:30
поделиться