В SQL Server можете да използвате T-SQL REPLACE()
функция за замяна на всички екземпляри на даден низ с друг низ. Например, можете да замените всички срещания на определена дума с друга дума.
Синтаксис
Ето официалния синтаксис:
REPLACE ( string_expression , string_pattern , string_replacement )
Където string_expression
е низът, който съдържа един или повече екземпляри на низа (или подниз) за замяна, string_pattern
е низът за замяна и string_replacement
е низът, който го замества.
Пример
Ето пример за демонстрация:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'some', 'no');
Резултат:
My apartment has no art hanging on the walls and no pot plants hanging from the ceiling.
Така че в този пример просто заменяме думата some
с думата no
.
Множество думи
Разбира се, няма правило, което да казва, че можете да замените дума само с една дума (и обратно). В крайна сметка ние просто заменяме низ с друг низ, независимо дали този низ съдържа думи, букви, цифри, интервали и т.н.
Така че лесно можехме да заменим тази дума с две или повече думи:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'some', 'lots of');
Резултат:
My apartment has lots of art hanging on the walls and lots of pot plants hanging from the ceiling.
Така че тук заменяме думата some
с думите lots of
.
Премахване на дума
Можете също да премахнете дума (или подниз) от низа. За да направите това, просто го заменете с празния низ:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'some', '');
Резултат:
My apartment has art hanging on the walls and pot plants hanging from the ceiling.
Въпреки това, ако погледнете внимателно, ще видите, че новият низ съдържа двойни интервали, където премахнахме думата. Това е така, защото думата, която премахнахме, имаше интервали отляво и отдясно. Премахнахме думата, но не премахнахме никакви интервали, следователно остават два интервала.
Можем да поправим това, като включим едно от интервалите в думата, която трябва да бъде премахната:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'some', '');
Резултат:
My apartment has art hanging on the walls and pot plants hanging from the ceiling.
Бъдете внимателни!
Много е лесно да правите грешки, когато използвате REPLACE()
функция (или всякаква намерете и заменете функционалността по този въпрос).
Например тази грешка:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'art', 'pictures');
Резултат:
My appicturesment has some pictures hanging on the walls and some pot plants hanging from the ceiling.
Както можете да видите, заменихме думата art
с pictures
. В този случай обаче думата apartment
също беше засегната – превърна се в apicturesment
, което не е било предвидено. Това е така, защото думата apartment
съдържа поднизът art
.
Обикновено можете да се предпазите от това, като добавите интервали около думата за търсене, както и заместващата дума:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', ' art ', ' pictures ');
Резултат:
My apartment has some pictures hanging on the walls and some pot plants hanging from the ceiling.
Това очевидно предполага, че заменяте цялата дума. Ще трябва да прецените всяка ситуация, когато възникне.
Сравняване/чувствителност на главни и малки букви
Можете да използвате незадължителния COLLATE
клауза за прилагане на изрично съпоставяне към входа. Това може да бъде удобно за извършване на операции за намиране/замяна, чувствителни към главни и други.
Ето пример, който сравнява две съпоставяния.
Регистърът не се отчита
SELECT REPLACE('Cats, cats, and more cats!' COLLATE SQL_Latin1_General_CP1_CI_AS, 'cat', 'Dog');
Резултат:
Dogs, Dogs, and more Dogs!
В този пример съпоставянето, което посочваме, включва _CI
в името си, което означава „Нечувствителен към главни букви“. Това води до замяна на всички събития, въпреки че първото срещане е с главни букви.
Ще забележите, че този метод не засяга случая на заменения низ.
Регистърът на буквите е чувствителен
SELECT REPLACE('Cats, cats, and more cats!' COLLATE SQL_Latin1_General_CP1_CS_AS, 'cat', 'Dog');
Резултат:
Cats, Dogs, and more Dogs!
В този пример съпоставянето, което посочваме, включва _CS
в името му, което означава „чувствителен към главни букви“. Това причинява първото появяване на Cat
да бъде пропуснат, тъй като първият му знак е главна буква (която не съвпада с регистъра на втория аргумент).