私のデータは次のようになります
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 を見ましたが、「;」をチェックする実行可能な方法を考えることはできません。
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)
一部のフィールドに「;」がある場合また、フィールドにセミコロンを追加して、説明されているのと同じ方法を使用することもできません。
SET MyText = LEFT(MyText+';', CHARINDEX(';',MyText+';')-1)
CASE WHEN
を使用して、「;」のないものを残すことができます一人で。
SELECT
CASE WHEN CHARINDEX(';', MyText) > 0 THEN
LEFT(MyText, CHARINDEX(';', MyText)-1) ELSE
MyText END
FROM MyTable
CHARINDEX
を使用して「;」を見つけます。次に、SUBSTRING
を使用して、「;」の前の部分のみを返します。
UPDATE MyTable
SET MyText = SUBSTRING(MyText, 1, CHARINDEX(';', MyText) - 1)
WHERE CHARINDEX(';', MyText) > 0
文字列に対して何かを置換または一致(検索)する必要がある状況では、正規表現を使用することを好みます。
正規表現はT-SQL
で完全にサポートされていないため、CLR
関数を使用して正規表現を実装できます。さらに、C#
やCLR
の知識はまったく必要ありません。必要なものはすべてMSDN String Utility Functions Sample で既に入手可能です。
あなたの場合、正規表現を使用したソリューションは次のとおりです。
SELECT [dbo].[RegexReplace] ([MyColumn], '(;.*)', '')
FROM [dbo].[MyTable]
しかし、データベースにそのような機能を実装すると、より複雑な問題を解決するのに役立ちます。
以下の例は、[dbo].[RegexReplace]
関数のみをデプロイする方法を示していますが、String Utility
クラス全体をデプロイすることをお勧めします。
CLR統合を有効にします。次のTransact-SQLコマンドを実行します。
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
コードの作成(または.dll
の作成)。一般的には、Visual Studioまたは.NET Frameworkコマンドプロンプト(記事に示されているように)を使用してこれを行うことができますが、Visual Studioを使用することを好みます。
新しいクラスライブラリプロジェクトを作成します。
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
ファイルへのパスを取得します。
次の.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