Заменить несколько специальных символов на одну черту - PullRequest
0 голосов
/ 22 мая 2018

Привет. У меня есть данные как (СКАРФ.) / (ОБРАТЫ), и я хочу показать их как СКАРФ-ОБРАТЫ, но я не могу их получить

Мой код ниже -

DECLARE @str VARCHAR(400)
DECLARE @specialchars VARCHAR(50) = '%[/,~,@,#,$,%,&,*,(,),.,!^?:]%'
--SET @str = 'KRA!NTHI@#KUMAR, KU%^?MAR GO~()$U.BigGrin'
SET @str = '(SCARF.) / (WRAPS)'
SET @str = REPLACE(@str,'.','')
WHILE PATINDEX( @specialchars, @str ) > 0
SET @str = REPLACE(REPLACE( @str, SUBSTRING( @str, PATINDEX( @specialchars, @str ), 1 ),'-'),'-','-')

IF(LEFT(@str, 1) = '-')
   set @str = RIGHT(@str, LEN(@str) - 1)
IF(RIGHT(@str, 1) = '-')
   set @str = LEFT(@str, LEN(@str) - 1)

SELECT REPLACE(@str,' ','-')

но он дает данные в виде SCARF ----- WRAPS вместо SCARF-WRAPS

У меня такой тип данных, как несколько, и я хочу преобразовать их как с одной чертой.

Например:

«УХОД ЗА КОЖЕЙ И КРАСОТА» должен измениться на «УХОД ЗА КОЖЕЙ-КРАСОТАЮ»

«BANDANAS / DURAGS / WRAPS» должен изменитьсяна «BANDANAS-DURAGS-WRAPS»

«Шляпы и глушители» должны измениться на «Шляпы-глушители»

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Попробуйте это:

DECLARE @str VARCHAR(400)='(SCARF.) / (WRAPS)'
DECLARE @specialchars VARCHAR(50) = '%[/,~,@,#,$,%,&,*,(,),.,!^?:-]%'

WHILE PATINDEX( @specialchars, @str ) > 0
SET @str = REPLACE( @str, SUBSTRING( @str, PATINDEX( @specialchars, @str ), 1 ),' ')

SELECT REPLACE(REPLACE(REPLACE(RTRIM(LTRIM(@str)), ' ', '- '), ' -', ''), ' ', '')
0 голосов
/ 22 мая 2018

Я не собираюсь говорить, что это решение довольно;это не.это делает работу, но я не ожидаю, что она будет работать быстро.Он использует NGrams8k Алана Бурштейна, поэтому вам необходимо убедиться, что у вас также есть копия на вашем сервере.

, если вы ее не понимаете, не стесняйтесьспросите (кроме того, как работает NGrams8K, для этого и предназначена статья):

CREATE TABLE T (string varchar(400));
INSERT INTO T
VALUES ('KRA!NTHI@#KUMAR, KU%^?MAR GO~()$U.BigGrin'),
       ('(SCARF.) / (WRAPS)');
GO
WITH Replacements AS (
    SELECT *,
           CASE WHEN NG.token NOT LIKE '[ /,~@#$%&*().!^?:]' THEN NG.token ELSE '-' END AS TokenR
    FROM T
         CROSS APPLY dbo.NGrams8k ('-'+T.String+'-',1) NG),
Repeating AS (
    SELECT *,
           CASE WHEN TokenR = '-' AND TokenR = LAG(TokenR) OVER (PARTITION BY string ORDER BY position) THEN NULL ELSE TokenR END AS TokenRR
    FROM Replacements),
Cleaned AS (
    SELECT string,
           STUFF((SELECT sq.TokenRR + ''
                  FROM Repeating sq
                  WHERE sq.TokenRR IS NOT NULL
                    AND sq.string = R.string
                  ORDER BY position
                  FOR XML PATH('')),1,1,'') AS CleanString
    FROM Repeating R
    GROUP BY string)
SELECT string, LEFT(CleanString, LEN(CleanString)-1) AS CleanedString
FROM Cleaned;

GO
DROP TABLE T;

С предоставленными примерами данных вы получите следующий результат:

string                                     | CleanedString
-------------------------------------------|---------------------------------
(SCARF.) / (WRAPS)                         | SCARF-WRAPS
KRA!NTHI@#KUMAR, KU%^?MAR GO~()$U.BigGrin  | KRA-NTHI-KUMAR-KU-MAR-GO-U-BigGrin
...