V SQL Server můžete použít T-SQL REPLACE()
funkce, která nahradí všechny výskyty daného řetězce jiným řetězcem. Můžete například nahradit všechny výskyty určitého slova jiným slovem.
Syntaxe
Zde je oficiální syntaxe:
REPLACE ( string_expression , string_pattern , string_replacement )
Kde string_expression
je řetězec, který obsahuje jednu nebo více instancí řetězce (nebo podřetězce), který má být nahrazen, string_pattern
je řetězec, který se má nahradit, a string_replacement
je řetězec, který jej nahradí.
Příklad
Zde je příklad k demonstraci:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'some', 'no');
Výsledek:
My apartment has no art hanging on the walls and no pot plants hanging from the ceiling.
V tomto příkladu tedy jednoduše nahradíme slovo some
se slovem no
.
Více slov
Samozřejmě neexistuje žádné pravidlo, které by říkalo, že slovo můžete nahradit pouze jedním slovem (a naopak). Koneckonců, jednoduše nahrazujeme řetězec jiným řetězcem, bez ohledu na to, zda tento řetězec obsahuje slova, písmena, čísla, mezery atd.
Takže jsme to jedno slovo mohli snadno nahradit dvěma nebo více slovy:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'some', 'lots of');
Výsledek:
My apartment has lots of art hanging on the walls and lots of pot plants hanging from the ceiling.
Zde tedy nahradíme slovo some
se slovy lots of
.
Odebrat slovo
Z řetězce můžete také odstranit slovo (nebo podřetězec). Chcete-li to provést, jednoduše jej nahraďte prázdným řetězcem:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'some', '');
Výsledek:
My apartment has art hanging on the walls and pot plants hanging from the ceiling.
Pokud se však podíváte pozorně, uvidíte, že nový řetězec obsahuje dvojité mezery, kde jsme slovo odstranili. Je to proto, že slovo, které jsme odstranili, mělo vlevo a vpravo mezery. Odstranili jsme slovo, ale neodstranili jsme žádné mezery, proto zůstávají dvě mezery.
Můžeme to opravit vložením jedné z mezer ve slově, které má být odstraněno:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'some ', '');
Výsledek:
My apartment has art hanging on the walls and pot plants hanging from the ceiling.
Buďte opatrní!
Při použití REPLACE()
je velmi snadné dělat chyby funkce (nebo jakákoli najít a nahradit funkcionalitu).
Například tato chyba:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', 'art', 'pictures');
Výsledek:
My appicturesment has some pictures hanging on the walls and some pot plants hanging from the ceiling.
Jak vidíte, nahradili jsme slovo art
s pictures
. V tomto případě však slovo apartment
byl také ovlivněn – změnil se na apicturesment
, což nebylo zamýšleno. Důvodem je slovo apartment
obsahuje podřetězec art
.
Obvykle se proti tomu můžete chránit přidáním mezer kolem hledaného slova a také náhradního slova:
SELECT REPLACE('My apartment has some art hanging on the walls and some pot plants hanging from the ceiling.', ' art ', ' pictures ');
Výsledek:
My apartment has some pictures hanging on the walls and some pot plants hanging from the ceiling.
To samozřejmě předpokládá, že nahrazujete celé slovo. Budete muset posoudit každou situaci, jakmile nastane.
Řazení/rozlišování malých a velkých písmen
Můžete použít volitelný COLLATE
klauzule pro použití explicitního řazení na vstup. To se může hodit při provádění operací hledání/nahrazení rozlišujících velká a malá písmena a podobně.
Zde je příklad, který porovnává dvě kolace.
Nerozlišují se malá a velká písmena
SELECT REPLACE('Cats, cats, and more cats!' COLLATE SQL_Latin1_General_CP1_CI_AS, 'cat', 'Dog');
Výsledek:
Dogs, Dogs, and more Dogs!
V tomto příkladu zadané řazení zahrnuje _CI
v jeho názvu, což znamená „Nerozlišuje malá a velká písmena“. To způsobí, že všechny výskyty budou nahrazeny, přestože první výskyt obsahuje velká písmena.
Všimnete si, že tato metoda neovlivňuje velikost nahrazeného řetězce.
Rozlišují se malá a velká písmena
SELECT REPLACE('Cats, cats, and more cats!' COLLATE SQL_Latin1_General_CP1_CS_AS, 'cat', 'Dog');
Výsledek:
Cats, Dogs, and more Dogs!
V tomto příkladu zadané řazení zahrnuje _CS
v jeho názvu, což znamená „Rozlišovat malá a velká písmena“. To způsobí první výskyt Cat
přeskočit, protože jeho prvním znakem je velké písmeno (což neodpovídá velikosti druhého argumentu).