2016-07-16 5 views
0

Можно ли использовать регулярное выражение Regex i.e в SQL Server? Я использую SQL-2012 и 2014, и есть требование сопоставления и возврата ввода из моей хранимой процедуры.Сравнение шаблонов SQL с использованием регулярного выражения

Я не могу использовать LIKE в этой ситуации, так как возвращает только соответствующие слова, используя Regex. Я могу сопоставить целую кучу символов, таких как Space, Hyphen, Numbers.

Вот мой SP

--Suppose XYZ P is my Search Condition 
Declare @Condition varchar(50) = 'XYZ P' 

CREATE PROCEDURE [dbo].[usp_MATCHNAME] 
    @Condition varchar(25) 
as 
Begin 

select * from tblPerson 
where UPPER(Name) like UPPER(@Condition) + '%' 
-- It should return both XYZ P and xyzp 
End 

Вот мой SP собирается вернуть все условия согласования, где Name = XYZ P, но, как получить другой столбец, имеющий имя как [XYZP, XYZP]

и если условие поиска имеет какое-либо значение Буквенно как

--Suppose XYZ 1 is my Search Condition 
Declare @Condition varchar(50) = 'XYZ 1' 

Тогда мой результат поиска также должен возвращать nonspace значения как [XYZ1, xyz1, а -1].

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

Примечание: Мое условие ввода i.e., @Condition может иметь как пространство, так и пробел меньше, значение Hyphen (-) при выполнении хранимой процедуры.

ответ

1

Использование команды REPLACE.

Он заменит единое пространство в %, поэтому он будет возвращать ваши ожидаемые результаты:

SELECT * 
FROM tblPerson 
WHERE UPPER(Name) LIKE REPLACE(UPPER(@Condition), ' ', '%') + '%' 
+0

Это работает ... Но нет никакой гарантии, что каждый SP будет получая параметр, имеющий пространство между ними. У нас даже может быть дефис – Amar

+0

@Amar: Replace будет работать, только если параметр имеет пробел. – Arulkumar

+1

Спасибо за демонстрацию замены, но это не сработает, если я должен найти его эквивалентный символ, например, если @Condition = 'XYZ 1' – Amar

0

Я использовал REPLACE команду. Самое главное, вам нужно использовать REPLACE по обе стороны от LIKE или = ключевое слово.

DECLARE @table TABLE (id int,item VARCHAR(50)) 
INSERT @table VALUES (1,'ABCDEF') 
INSERT @table VALUES (2,'ABC DEF') 
INSERT @table VALUES (3,'ABC-DEF') 
INSERT @table VALUES (4,'XYZ') 
INSERT @table VALUES (5,'ABC DEF') 
INSERT @table VALUES (6,'ABCxyzDEF') 

DECLARE @condition VARCHAR(50) = 'ABC-DEF' 

SELECT * FROM @table 
WHERE REPLACE(REPLACE(item,' ',''),'-','') LIKE REPLACE(REPLACE(@condition,' ',''),'-','') 

Выход выше запроса:

id item 
1 ABCDEF 
2 ABC DEF 
3 ABC-DEF 
5 ABC DEF 

В вашем случае запрос будет:

SELECT * FROM tblPerson 
WHERE REPLACE(REPLACE(UPPER(Name),' ',''),'-','') LIKE REPLACE(REPLACE(UPPER(@Condition),' ',''),'-','') 
Смежные вопросы