SQL Server remplacer, supprimer tout après certain caractère
Mes données ressemblent à
ID MyText
1 some text; some more text
2 text again; even more text
Comment puis-je mettre à jour MyText pour tout supprimer après le point-virgule et y compris le point-virgule, Donc il me reste ce qui suit:
ID MyText
1 some text
2 text again
J'ai regardé SQL Server Replace, mais je ne peux pas penser à un moyen viable de vérifier le"; "
6 réponses
Utiliser LEFT combiné avec CHARINDEX:
UPDATE MyTable
SET MyText = LEFT(MyText, CHARINDEX(';', MyText) - 1)
WHERE CHARINDEX(';', MyText) > 0
Notez que la clause WHERE ignore la mise à jour des lignes dans lesquelles il n'y a pas de point-virgule.
Voici du code pour vérifier les travaux SQL ci-dessus:
declare @MyTable table ([id] int primary key clustered, MyText varchar(100))
insert into @MyTable ([id], MyText)
select 1, 'some text; some more text'
union all select 2, 'text again; even more text'
union all select 3, 'text without a semicolon'
union all select 4, null -- test NULLs
union all select 5, '' -- test empty string
union all select 6, 'test 3 semicolons; second part; third part;'
union all select 7, ';' -- test semicolon by itself
UPDATE @MyTable
SET MyText = LEFT(MyText, CHARINDEX(';', MyText) - 1)
WHERE CHARINDEX(';', MyText) > 0
select * from @MyTable
J'obtiens les résultats suivants:
id MyText
-- -------------------------
1 some text
2 text again
3 text without a semicolon
4 NULL
5 (empty string)
6 test 3 semicolons
7 (empty string)
Pour les moments où certains champs ont un"; " et d'autres non, vous pouvez également ajouter un point-virgule au champ et utiliser la même méthode décrite.
SET MyText = LEFT(MyText+';', CHARINDEX(';',MyText+';')-1)
Pourrait utiliser CASE WHEN
pour laisser ceux qui n'ont pas de ';' seuls.
SELECT
CASE WHEN CHARINDEX(';', MyText) > 0 THEN
LEFT(MyText, CHARINDEX(';', MyText)-1) ELSE
MyText END
FROM MyTable
Utiliser CHARINDEX
pour trouver le ";". Ensuite, utilisez SUBSTRING
pour simplement retourner la partie avant le";".
UPDATE MyTable
SET MyText = SUBSTRING(MyText, 1, CHARINDEX(';', MyText) - 1)
WHERE CHARINDEX(';', MyText) > 0
Pour les situations où j'ai besoin de remplacer ou de faire correspondre(trouver) quelque chose avec une chaîne, je préfère utiliser des expressions régulières.
Puisque les expressions régulières ne sont pas entièrement prises en charge dans T-SQL
, vous pouvez les implémenter en utilisant les fonctions CLR
. De plus, vous n'avez pas besoin de connaissances C#
ou CLR
car tout ce dont vous avez besoin est déjà disponible dans L'exemple de fonctions D'utilitaire de chaîne MSDN .
Dans votre cas, la solution utilisant des expressions régulières est:
SELECT [dbo].[RegexReplace] ([MyColumn], '(;.*)', '')
FROM [dbo].[MyTable]
Mais implémenter une telle fonction dans votre base de données va vous aider à résoudre des problèmes plus complexes.
L'exemple ci-dessous montre comment déployer uniquement les [dbo].[RegexReplace]
function, mais je vous recommande de déployer l'ensemble String Utility
classe.
-
Activation de L'intégration CLR. Exécutez les commandes Transact-SQL suivantes:
sp_configure 'clr enabled', 1 GO RECONFIGURE GO
-
Ajouter le code (ou créer le
.dll
). En général, vous pouvez le faire en utilisant la commande Visual Studio ou. NET Framework invite (comme il est indiqué dans l'article), mais je préfère utiliser visual studio.-
Créer un nouveau projet de bibliothèque de classes:
-
Copiez et collez le code suivant dans le
Class1.cs
fichier:using System; using System.IO; using System.Data.SqlTypes; using System.Text.RegularExpressions; using Microsoft.SqlServer.Server; public sealed class RegularExpression { public static string Replace(SqlString sqlInput, SqlString sqlPattern, SqlString sqlReplacement) { string input = (sqlInput.IsNull) ? string.Empty : sqlInput.Value; string pattern = (sqlPattern.IsNull) ? string.Empty : sqlPattern.Value; string replacement = (sqlReplacement.IsNull) ? string.Empty : sqlReplacement.Value; return Regex.Replace(input, pattern, replacement); } }
-
Construisez la solution et obtenez le chemin d'accès au fichier
.dll
Créé: -
Remplacez le chemin d'accès au fichier
.dll
dans les instructionsT-SQL
suivantes et exécutez les:IF OBJECT_ID(N'RegexReplace', N'FS') is not null DROP Function RegexReplace; GO IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'StringUtils') DROP ASSEMBLY StringUtils; GO DECLARE @SamplePath nvarchar(1024) -- You will need to modify the value of the this variable if you have installed the sample someplace other than the default location. Set @SamplePath = 'C:\Users\gotqn\Desktop\StringUtils\StringUtils\StringUtils\bin\Debug\' CREATE ASSEMBLY [StringUtils] FROM @SamplePath + 'StringUtils.dll' WITH permission_set = Safe; GO CREATE FUNCTION [RegexReplace] (@input nvarchar(max), @pattern nvarchar(max), @replacement nvarchar(max)) RETURNS nvarchar(max) AS EXTERNAL NAME [StringUtils].[RegularExpression].[Replace] GO
-
C'est ça. Testez votre fonction:
declare @MyTable table ([id] int primary key clustered, MyText varchar(100)) insert into @MyTable ([id], MyText) select 1, 'some text; some more text' union all select 2, 'text again; even more text' union all select 3, 'text without a semicolon' union all select 4, null -- test NULLs union all select 5, '' -- test empty string union all select 6, 'test 3 semicolons; second part; third part' union all select 7, ';' -- test semicolon by itself SELECT [dbo].[RegexReplace] ([MyText], '(;.*)', '') FROM @MyTable select * from @MyTable
-