Регулярное выражение для запроса к SQL Server - PullRequest
0 голосов
/ 20 марта 2019

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

Это пример:

Запрошенные данные: 322211564

Найдено данных: 322'211'564

Также 322-211-564

РЕДАКТИРОВАТЬ: Просто чтобы уточнить, я не хочу ИСКЛЮЧИТЬ данные, но "переформатировать" их без символов.

РЕДАКТИРОВАТЬ: Кстати, если вам интересно использовать Laravel 5.7, очевидно, вы можете напрямую запросить аксессор, если у вас уже есть коллекция. Я удивлен, но это помогает.

Ответы [ 2 ]

3 голосов
/ 20 марта 2019

Угадай подстановочный знак, но, возможно, это работает:

WITH VTE AS(
    SELECT *
    FROM (VALUES('322''211''564'),
                ('322-211-564')) V(S))
SELECT S,
       (SELECT '' + token
        FROM dbo.NGrams8k(V.S,1) N
        WHERE token LIKE '[A-z0-9]'
        ORDER BY position
        FOR XML PATH('')) AS S2
FROM VTE V;

Используется функция NGrams8k. Если вам нужны другие допустимые символы, вы можете просто добавить их в строку шаблона ('[A-z0-9]').

Если по какой-то причине вы не хотите использовать NGrams8k, вы можете создать встроенную таблицу подсчета, которая будет выполнять аналогичную функцию:

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1 --10
         CROSS JOIN N N2 --100
         CROSS JOIN N N3 --1000
         CROSS JOIN N N4 --10000 --Do we need any more than that? You may need less
    ),
VTE AS(
    SELECT *
    FROM (VALUES('322''211''564'),
                ('322-211-564')) V(S))    
SELECT V.S,
       (SELECT '' + SS.C
        FROM Tally T
             CROSS APPLY (VALUES(SUBSTRING(V.S,T.I,1))) SS(C)
        WHERE SS.C LIKE '[A-z0-9]'
        ORDER BY T.I
        FOR XML PATH(''),TYPE).value('.','varchar(8000)') AS S2
FROM VTE V;

Также, на всякий случай, я использовал формат TYPE и функцию value. Если вы затем передумаете не использовать специальные символы и вам понадобится приемлемый символ, такой как &, он не изменится на &.

0 голосов
/ 20 марта 2019

Примечание для замены строк на основе шаблона , вы можете использовать библиотеку типа SQL Server Regex. Вызовите RegexReplace в строке, которую вы хотите преобразовать:

select RegexReplace(col, '[^A-Za-z0-9]', '') from tbl

Этот вызов удалит все не алфавитно-цифровые символы.

Чтобы найти все строки, в которых столбец содержит только буквенно-цифровые символы:

select col from tbl where col not like '%[^A-Za-z0-9]%'

Шаблон like состоит из:

% - соответствует 0 или более символам.

[^ A-Za-z0-9] - Соответствует любому символу, кроме A-Z, a-z и 0-9. Символ ^ в начале класса символов означает символы, которые не совпадают.

При использовании not like ваш запрос будет отклонять строки, содержащие не буквенно-цифровые символы, в любом месте строки.

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