web-dev-qa-db-fra.com

SQL Server: remplacer par des caractères génériques?

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.

7
Manngo

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

3
Solomon Rutzky

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 '%:\%'
0
Richard Varno

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%'
0
CaM