Определение специальных символов и чисел в SQL

В моем случае у меня есть переменная varchar, такая как Test1@abc. Я хочу определить специальные символы и числа в этой строке и вернуть их. Эта строка может содержать только буквы алфавита, пробел и знак подчеркивания (a-z, A-Z, пробел, _). Все остальные символы не допускаются. Я хочу вернуть их. Спасибо.

DECLARE @StringVal VARCHAR(250) = 'Test1@abc' 
IF(--condition)
BEGIN
    --output -> 1,@
END

Если строка «может включать только буквы алфавита, пробел и знак подчеркивания (az, AZ, пробел, _)», то почему там только символы? Ясно, что разрешено.

Thom A 21.12.2020 11:47

Кроме того, срок службы SQL Server 2008 истек более года назад, поэтому вам действительно следует рассмотреть пути обновления как можно скорее.

Thom A 21.12.2020 11:47
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
252
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Использование регулярных выражений

DECLARE @StringVal VARCHAR(400) = 'Test1@abc'

DECLARE @expres VARCHAR(50) = '%[^~,@,#,$,%,&,*,(,),.,!,0-9]%'

WHILE PATINDEX( @expres, @StringVal ) > 0
SET @StringVal = Replace(REPLACE( @StringVal, SUBSTRING( @StringVal, PATINDEX( @expres, @StringVal ), 1 ),''),'-',' ')

IF(@StringVal LIKE '%[~,@,#,$,%,&,*,(,),.,!,0-9]%')
BEGIN
SELECT @StringVal AS [Special Char]
END
ELSE
SELECT 'No Special Characters'  AS [Non Special Char]

@прасанга . . . Я не думаю, что лучшее решение включает в себя перечисление символов, которые не могут быть включены. Достаточно просто выразить логику на основе тех, которые можно включить.

Gordon Linoff 21.12.2020 13:13

Если вы так думаете, то вы можете изменить логику вместо того, чтобы не включать специальные символы, DECLARE @expres VARCHAR(50) = '%[a-zA-Z]%' - мы можем включить алфавиты как в объявление, так и в условное Проверить (если) stmts

Thiyagu 21.12.2020 13:29
Ответ принят как подходящий

Если вы хотите, чтобы результаты были просто распечатаны, вы можете использовать:

DECLARE @StringVal VARCHAR(400) = 'Test1@abc';  
DECLARE @expres VARCHAR(MAX) = '%[^a-zA-Z_]%';

WHILE @StringVal LIKE @expres
BEGIN
    PRINT SUBSTRING(@stringVal, PATINDEX(@expres, @stringVal), 1);
    SET @stringval = STUFF(@stringVal, 1, PATINDEX(@expres, @stringVal), '');
END;

Если вы хотите, чтобы они выводились в виде строки, вы можете объединить их:

DECLARE @StringVal VARCHAR(400) = 'Test1@abc';
DECLARE @expres VARCHAR(MAX) = '%[^a-zA-Z_]%';
DECLARE @output VARCHAR(MAX) = '';

WHILE @StringVal LIKE @expres
BEGIN
    SET @output = @output + SUBSTRING(@stringVal, PATINDEX(@expres, @stringVal), 1);
    SET @stringval = STUFF(@stringVal, 1, PATINDEX(@expres, @stringVal), '');
END;

SELECT @output;

Здесь db<>рабочий пример.

Другие вопросы по теме