Microsoft SQL Server prend-il en charge nativement une sorte de fonction replace
utilisant des caractères génériques? Je suppose que les expressions régulières ne sont pas disponibles en natif.
Je note qu'il existe une fonction PATINDEX
qui peut être utilisée pour assembler une solution - y a-t-il quelque chose qui le fait plus simplement?
Par exemple REPLACE(data,'[xy]','q')
pour remplacer x
ou y
par q
.
La fonction intégrée REPLACE
ne prend pas en charge les modèles ou les caractères génériques; seuls LIKE
et PATINDEX
le font.
En supposant que vous vouliez vraiment simplement le remplacement simple à un caractère comme indiqué dans la question, vous pouvez appeler REPLACE
deux fois, l'un imbriqué dans l'autre, comme suit:
SELECT REPLACE(
REPLACE('A B x 3 y Z x 943 yy!',
'x',
'q'),
'y',
'q');
Retour:
A B q 3 q Z q 943 qq!
Si vous avez besoin d'une correspondance/d'un remplacement de modèle plus complexe, vous devrez le faire via des expressions régulières, qui ne peuvent être effectuées que via SQLCLR. Plusieurs fonctions SQLCLR RegEx sont disponibles dans la version gratuite de la bibliothèque SQL # SQLCLR (que j'ai écrite), l'une d'entre elles étant RegEx_Replace[4k]()
(la version 4k
Est car lorsque vous êtes certain de ne jamais avoir besoin de plus de 4000 caractères, vous pouvez donc obtenir de meilleures performances en n'utilisant pas NVARCHAR(MAX)
comme paramètre d'entrée ou valeur de retour).
L'équivalent des deux appels imbriqués REPLACE
se ferait comme suit (et en utilisant la syntaxe de modèle indiquée dans la question):
SELECT SQL#.RegEx_Replace4k(N'A B x 3 y Z x 943 yy!', N'[xy]', N'q', -1, 1, NULL);
Retour:
A B q 3 q Z q 943 qq!
Mais, puisque nous parlons de la possibilité d'un modèle plus complexe, qui ne peut pas être fait facilement dans T-SQL, nous pouvons utiliser un quantificateur sur le modèle pour qu'il remplace n'importe quel nombre de x
ou y
caractères avec un seul q
:
SELECT SQL#.RegEx_Replace4k(N'A B x 3 y Z xx 943 yyxxyxy!', N'[xy]+', N'q', -1, 1, NULL);
Retour:
A B q 3 q Z q 943 q!
Veuillez noter que la chaîne d'entrée a été légèrement modifiée par rapport aux deux exemples précédents pour ajouter un x
supplémentaire après le Z
et pour ajouter un xxyxy
supplémentaire au yy
à la fin. Et, dans les deux cas, le fragment à plusieurs caractères a été remplacé par un seul q
.
Pour plus d'informations sur l'utilisation des chaînes et des classements, veuillez visiter: Collations Info
La réponse ci-dessus de CaM alors qu'elle ne répond pas à la question des affiches, m'a aidé dans une situation où je devais standardiser les chemins d'exportation (où le chemin d'exportation pourrait être D:\mypath E:\mypath ou 10.10.10.128\C $\mypath etc ...) peut-être que cela aidera quelqu'un d'autre
-- standardize output paths
UPDATE dbo.ELDPdf
SET OutputPath = SUBSTRING(OutputPath, PATINDEX('%$%', OutputPath)+2,1000)
WHERE JobSummaryId = @JobSummaryId
AND OutputPath LIKE '%$%'
UPDATE dbo.ELDPdf
SET OutputPath = SUBSTRING(OutputPath, PATINDEX('%:%', OutputPath)+2,1000)
WHERE JobSummaryId = @JobSummaryId
AND OutputPath LIKE '%:\%'
Cet article: https://stackoverflow.com/questions/13253259/sql-server-replace-command-with-wildcard semble assez similaire et fait référence à ce lien: https: // stackoverflow .com/questions/150977/perform-regex-replace-in-an-sql-query
Une autre option est quelque chose comme
UPDATE myTable
SET myField = LEFT(myField, PATINDEX('%Z%', myField))
WHERE myField LIKE '%X%'
OR myField LIKE '%Y%'