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"; "

43
demandé sur OMG Ponies 2009-11-03 18:25:07

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)
86
répondu Paul Williams 2015-03-12 12:59:34

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)
16
répondu Rashlien 2010-12-07 23:14:31

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
9
répondu Rookie 2014-06-17 10:21:19

Utiliser CHARINDEX pour trouver le ";". Ensuite, utilisez SUBSTRING pour simplement retourner la partie avant le";".

3
répondu David 2014-06-17 10:21:01
UPDATE MyTable
   SET MyText = SUBSTRING(MyText, 1, CHARINDEX(';', MyText) - 1)
 WHERE CHARINDEX(';', MyText) > 0 
2
répondu manji 2009-11-03 15:54:34

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.

  1. Activation de L'intégration CLR. Exécutez les commandes Transact-SQL suivantes:

    sp_configure 'clr enabled', 1
    GO
    RECONFIGURE
    GO  
    
  2. 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:

      entrez la description de l'image ici

    • 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éé:

      entrez la description de l'image ici

    • Remplacez le chemin d'accès au fichier .dll dans les instructions T-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
      
1
répondu gotqn 2015-03-01 10:55:48