Как выбрать алфавиты только из строки? - PullRequest
0 голосов
/ 30 октября 2019

Как получить алфавиты только из строки, используя данные sql server 2012 query.my и желаемый результат и код, указанные ниже.

select ',1,,3,,Mango,.,.,Apple,Orange' InputString,'MangoAppleOrange' ExecptedString
union all
select ',,,99,,,Apple,.,.,,Mango,,,Grape,,','AppleMangoGrape'
union all
select ',,,99,,-,Banana,/....*,.,,Mango,,,Grape,,','BananaMangoGrape'

Ожидаемый результат enter image description here

Я поделился своими попытками

declare @inputstr varchar(50)='12.Apple,98,Banana'
select SUBSTRING(@inputstr,1,ISNULL(NULLIF(PATINDEX('%[^A-Za-z.''0-9]%',LTRIM(RTRIM(@inputstr))),0)-1,LEN(@inputstr)))

Ответы [ 4 ]

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

Одна опция определенно является пользовательской функцией. Однако вы также можете сделать это с помощью рекурсивного CTE:

with cte as (
      select inputstring, inputstring as str, convert(varchar(max), '') as expected
      from t
      union all
      select inputstring, stuff(str, 1, 1, ''),
             (case when str like '[a-zA-Z]%' then expected + left(str, 1) else expected end)
      from cte
      where str <> ''
     )
select inputstring, max(expected)
from cte
group by inputstring;

Здесь - это db <> скрипка.

Если ваши строки могут превышать 99 символов, тогдадобавить option (maxrecursion 0).

2 голосов
/ 30 октября 2019

Вместо того, чтобы использовать rCTE (который может стать очень медленным), я собираюсь использовать Alan Burstein NGrams8K, который использует подсчет и, следовательно, быстрее, чтобы деконструировать строку и затем использоватьFOR XML PATH чтобы восстановить его:

WITH YourTable AS
    (SELECT ',1,,3,,Mango,.,.,Apple,Orange' AS InputString,
            'MangoAppleOrange' AS ExecptedString
     UNION ALL
     SELECT ',,,99,,,Apple,.,.,,Mango,,,Grape,,',
            'AppleMangoGrape'
     UNION ALL
     SELECT ',,,99,,-,Banana,/....*,.,,Mango,,,Grape,,',
            'BananaMangoGrape')
SELECT YT.InputString,
       (SELECT '' + NG.token
        FROM dbo.NGrams8k(YT.InputString,1) NG
        WHERE NG.token LIKE '[A-z]'
        ORDER BY NG.position ASC
        FOR XML PATH(''),TYPE).value('.','varchar(MAX)') AS NewString
FROM YourTable YT;
0 голосов
/ 30 октября 2019

идти с temp1 как (выберите ', 1,, 3,, Mango,.,., Apple, Orange' InputString, 'MangoAppleOrange' Ожидаемое объединение строк все выберите ',,, 99 ,,, Apple ,. ,., Манго ,,, Виноград ,, ',' AppleMangoGrape 'объединение всех избранных' ,,, 99 ,, -, Банан, / .... ,. ,, Манго ,,, Виноград ,, ', 'BananaMangoGrape') выбрать заменить (заменить (заменить (заменить (заменить (заменить (заменить (заменить (заменить (InputString, ',', '')), 1, ''), '.', ''), '/',''), '', ''), 9, ''), 3, ''), '-', '') как ExpectedString1 из temp1

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

Вы можете создать функцию, которая возвращает только символы:

create function dbo.GetAlphanumeric 
(
    @inputString nvarchar(max)
)
returns table as return
(
    with t1(number) as (select 1 union all select 1),
    t2(number)  as (select 1 from t1 as a cross join t1 as b),
    t3(number)  as (select 1 from t2 as a cross join t2 as b),
    t4(number)  as (select 1 from t3 as a cross join t3 as b),
    nums(number) as (select row_number() over(order by (select null)) 
    from t4)

    select stuff( 
    (select   '' + substring(@inputString,nums.number,1)
    from nums
    where  patindex('%[^0-9a-za-z]%', substring(@inputString,nums.number,1)) =0
    for xml path('')),1,0,'') as execptedstring
)

И затем вызывать ее в операторе выбора при запросе табуляции, содержащей информацию, используя:

select InputString, ans.ExecptedString
from YourTable 
cross apply dbo.GetAlphanumeric(InputString) ans
...