web-dev-qa-db-ja.com

SQL Serverの置換、特定の文字の後にすべて削除

私のデータは次のようになります

ID    MyText
1     some text; some more text
2     text again; even more text

セミコロンの後、セミコロンを含むすべてをドロップするようにMyTextを更新するにはどうすればよいですか?

ID    MyText
1     some text
2     text again

SQL Server Replace を見ましたが、「;」をチェックする実行可能な方法を考えることはできません。

48
Jimmy

CHARINDEXと組み合わせたLEFTを使用します。

UPDATE MyTable
SET MyText = LEFT(MyText, CHARINDEX(';', MyText) - 1)
WHERE CHARINDEX(';', MyText) > 0

WHERE句は、セミコロンがない行の更新をスキップすることに注意してください。

上記のSQLが機能することを確認するコードを次に示します。

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

次の結果が得られます。

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)
93
Paul Williams

一部のフィールドに「;」がある場合また、フィールドにセミコロンを追加して、説明されているのと同じ方法を使用することもできません。

SET MyText = LEFT(MyText+';', CHARINDEX(';',MyText+';')-1)
18
Rashlien

CASE WHENを使用して、「;」のないものを残すことができます一人で。

    SELECT
    CASE WHEN CHARINDEX(';', MyText) > 0 THEN
    LEFT(MyText, CHARINDEX(';', MyText)-1) ELSE
    MyText END
    FROM MyTable
11
Rookie

CHARINDEXを使用して「;」を見つけます。次に、SUBSTRINGを使用して、「;」の前の部分のみを返します。

3
David
UPDATE MyTable
   SET MyText = SUBSTRING(MyText, 1, CHARINDEX(';', MyText) - 1)
 WHERE CHARINDEX(';', MyText) > 0 
2
manji

文字列に対して何かを置換または一致(検索)する必要がある状況では、正規表現を使用することを好みます。

正規表現はT-SQLで完全にサポートされていないため、CLR関数を使用して正規表現を実装できます。さらに、C#CLRの知識はまったく必要ありません。必要なものはすべてMSDN String Utility Functions Sample で既に入手可能です。

あなたの場合、正規表現を使用したソリューションは次のとおりです。

SELECT [dbo].[RegexReplace] ([MyColumn], '(;.*)', '')
FROM [dbo].[MyTable]

しかし、データベースにそのような機能を実装すると、より複雑な問題を解決するのに役立ちます。


以下の例は、[dbo].[RegexReplace]関数のみをデプロイする方法を示していますが、String Utilityクラス全体をデプロイすることをお勧めします。

  1. CLR統合を有効にします。次のTransact-SQLコマンドを実行します。

    sp_configure 'clr enabled', 1
    GO
    RECONFIGURE
    GO  
    
  2. コードの作成(または.dllの作成)。一般的には、Visual Studioまたは.NET Frameworkコマンドプロンプト(記事に示されているように)を使用してこれを行うことができますが、Visual Studioを使用することを好みます。

    • 新しいクラスライブラリプロジェクトを作成します。

      enter image description here

    • Class1.csファイルに次のコードをコピーして貼り付けます。

      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);
          }
      }
      
    • ソリューションをビルドし、作成された.dllファイルへのパスを取得します。

      enter image description here

    • 次の.dllステートメントのT-SQLファイルへのパスを置き換えて実行します。

      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
      
    • それでおしまい。機能をテストします。

      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
gotqn