web-dev-qa-db-ja.com

T-SQLのSQL Server正規表現

SQL Server用にT-SQLCLRなし、拡張SPなし、純粋T-SQL)で記述された正規表現ライブラリはありますか?

(共有ホスティングで動作するはずです)

編集:

  • PATINDEXLIKE,xp_spsandCLR`ソリューションについて知っているおかげで

  • regexに最適な場所ではないことも知っています。質問は理論的です:)

  • 機能制限も受け入れられます

122
xnagyg

PATINDEX 関数はどうですか?

TSQLのパターンマッチングは完全な正規表現ライブラリではありませんが、基本を提供します。

(Books Onlineから)

Wildcard  Meaning  
% Any string of zero or more characters.

_ Any single character.

[ ] Any single character within the specified range 
    (for example, [a-f]) or set (for example, [abcdef]).

[^] Any single character not within the specified range 
    (for example, [^a - f]) or set (for example, [^abcdef]).
76
Eric Z Beard

誰かがCLRで正規表現を使用することに興味があるなら、ここに解決策があります。以下の関数(C#.net 4.5)は、パターンが一致する場合は1を返し、パターンが一致しない場合は0を返します。サブクエリの行にタグを付けるために使用します。 SQLfunction属性は、このメソッドがSQLサーバーが使用する実際のUDFであることをSQLサーバーに伝えます。ファイルを管理スタジオからアクセスできる場所にdllとして保存します。

// default using statements above
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;

namespace CLR_Functions
{   
    public class myFunctions
    {
        [SqlFunction]
        public static SqlInt16 RegexContain(SqlString text, SqlString pattern)
        {            
            SqlInt16 returnVal = 0;
            try
            {
                string myText = text.ToString();
                string myPattern = pattern.ToString();
                MatchCollection mc = Regex.Matches(myText, myPattern);
                if (mc.Count > 0)
                {
                    returnVal = 1;
                }
            }
            catch
            {
                returnVal = 0;
            }

            return returnVal;
        }
    }
}

Management Studioで、プログラマビリティを介してdllファイルをインポートします-アセンブリ-新しいアセンブリ

次に、このクエリを実行します。

CREATE FUNCTION RegexContain(@text NVARCHAR(50), @pattern NVARCHAR(50))
RETURNS smallint 
AS
EXTERNAL NAME CLR_Functions.[CLR_Functions.myFunctions].RegexContain

その後、アセンブリを保存したデータベースを介して関数に完全にアクセスできるようになります。

次に、次のようなクエリで使用します。

SELECT * 
FROM 
(
    SELECT
        DailyLog.Date,
        DailyLog.Researcher,
        DailyLog.team,
        DailyLog.field,
        DailyLog.EntityID,
        DailyLog.[From],
        DailyLog.[To],
        dbo.RegexContain(Researcher, '[\p{L}\s]+') as 'is null values'
    FROM [DailyOps].[dbo].[DailyLog]
) AS a
WHERE a.[is null values] = 0
16
Matt Farguson

LIKEを使用して利用できる基本的なパターンマッチングがあります。%は任意の数と文字の組み合わせに一致し、_は任意の1文字に一致し、[abc]はa、b、またはcに一致します。 MSDNサイト

14
Steven Murawski

他の誰かがまだこの質問を見ている場合、 http://www.sqlsharp.com/ は無料、正規表現を追加する簡単な方法CLR関数をデータベースに追加します。

4
John Fisher

SQL Server 2016以降を使用している場合は、Rと共にsp_execute_external_scriptを使用できます。これには、grepgreplなどの正規表現検索用の機能があります。

メールアドレスの例を次に示します。 SQL Serverデータベースエンジンを介して「人」にクエリを実行し、それらの人のデータをRに渡し、Rに無効な電子メールアドレスを持つ人を決定させ、Rがその人のサブセットをSQL Serverに戻すようにします。 「人」は、[Application].[People]サンプルデータベースの[WideWorldImporters]テーブルからのものです。これらは、InputDataSetという名前のデータフレームとしてRエンジンに渡されます。 Rは、regpl文字列検索パターンに一致しない電子メールアドレスを持っている人を見つけるために、「not」演算子(感嘆符!)とともにgrepl関数を使用します。

EXEC sp_execute_external_script 
 @language = N'R',
 @script = N' RegexWithR <- InputDataSet;
OutputDataSet <- RegexWithR[!grepl("([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4}))", RegexWithR$EmailAddress), ];',
 @input_data_1 = N'SELECT PersonID, FullName, EmailAddress FROM Application.People'
 WITH RESULT SETS (([PersonID] INT, [FullName] NVARCHAR(50), [EmailAddress] NVARCHAR(256)))

適切な機能をSQL Serverホストにインストールする必要があることに注意してください。 SQL Server 2016の場合、「SQL Server Rサービス」と呼ばれます。 SQL Server 2017では、「SQL Server Machine Learning Services」に名前が変更されました。

Closing Thoughts MicrosoftのSQL(T-SQL)の実装には、RegExのネイティブサポートがありません。この提案されたソリューションは、CLRストアドプロシージャの使用よりもOPにとって望ましいものではありません。しかし、それは問題にアプローチするための追加の方法を提供します。

4
Dave Mason

OLE Automationを使用して、VBScriptの正規表現機能を使用できます。これは、アセンブリを作成および保守するオーバーヘッドよりもはるかに優れています。メインセクションの修正バージョンを入手するには、コメントセクションを必ず確認してください。

http://blogs.msdn.com/b/khen1234/archive/2005/05/11/416392.aspx

DECLARE @obj INT, @res INT, @match BIT;
DECLARE @pattern varchar(255) = '<your regex pattern goes here>';
DECLARE @matchstring varchar(8000) = '<string to search goes here>';
SET @match = 0;

-- Create a VB script component object
EXEC @res = sp_OACreate 'VBScript.RegExp', @obj OUT;

-- Apply/set the pattern to the RegEx object
EXEC @res = sp_OASetProperty @obj, 'Pattern', @pattern;

-- Set any other settings/properties here
EXEC @res = sp_OASetProperty @obj, 'IgnoreCase', 1;

-- Call the method 'Test' to find a match
EXEC @res = sp_OAMethod @obj, 'Test', @match OUT, @matchstring;

-- Don't forget to clean-up
EXEC @res = sp_OADestroy @obj;

SQL Server blocked access to procedure 'sys.sp_OACreate'...エラーが発生した場合は、sp_reconfigureを使用してOle Automation Proceduresを有効にしてください。 (はい、残念ながらサーバーレベルの変更です!)

Testメソッドに関する詳細情報が利用可能です here

ハッピーコーディング

0
James Poulose