2016-05-10 4 views
1

整数を含むサードパーティのツールから文字列を取り、intを取り除き、それを使ってローカルテーブルに結合する必要があります。私はI worked on ticket no. 123456 for a long timeのためにうまくいくPinal Dave's udf_GetNumeric functionを使用していますが、ユーザは5/9/2016 ticket 123456 was closed as duplicateのようなものを入力しています。これは5092016123456です。 ID列が> 9999ですが、SQLが([0-9]{5,})を理解できないため、検索パターンを変更して5つ以上の連続する数字のみを表示できます。私は残念ながら、完全正規表現を使用するCLRをインストールすることはできません。SQLで日付を含む可能性のある文字列からintを取得するにはどうすればよいですか?

+1

はあなたがすべての数字をテキストからスペースで区切られていることを前提とすることはできますか?スペースからのテキストを別々の行に分割し、数字だけを含む行を取る場合は? –

+0

あなたの質問は明確ではありません。いくつかのデータと希望の出力を見せてください。あなたが適用したいロジックは何ですか?なぜあなたはSQLがundestand regexpresionを意味しないのですか? [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を向上させ、より良い回答を得る方法を学ぼう。 –

+0

申し訳ありません。基本的には、私はここに "123456の文字列があります.2011年5月9日" 123456を取得したいと思います。 Sqlは正規表現を理解していますが、それは限られたサブセットです。 –

答えて

0

私たちのID列が> 9999であるので、わずか5つの以上 連続した数字を見て、私は検索パターンを変更することができますが、SQLは理解してい ん([0-9] {5、})。私はCLRをインストールできません

%[0-9][0-9][0-9][0-9][0-9]%を使用するように検索パターンを変更できます。それは5つの連続する整数の文字列を見つけるでしょう。例えば以下のように。

WITH T(Notes) 
    AS (SELECT 'I worked on ticket no 123456. for a long time ') 
SELECT *, 
     SUBSTRING(Notes, PatIdx, Length) 
FROM T 
     CROSS APPLY (SELECT PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%', Notes)) CA(PatIdx) 
     CROSS APPLY (SELECT PATINDEX('%[^0-9]%', SUBSTRING(Notes + ' ', PatIdx, 8000)) - 1) CA2(Length) 
+0

ありがとう、マーティン。これは今はうまくいくが、123456はID列であり、最終的には5,6個以上の数字を持つだろうが、それは将来的には十分に長いので、おそらくそれを心配する必要はないだろう。 –

+1

6つの連続した数字がある場合、5を見つけるパターンは6になります。しかし、開始点を見つけたら、その点から最初の非整数を見つけるべきでしょう。編集します。 –

+0

ありがとう!これはあまりにも機能し、私の答えよりも余りに少ないです。 –

0

JamesZの提案を使用してスペースを分割して、私は別の場所で使用していた古い機能を再利用しました。

CREATE FUNCTION [dbo].[tvf_CreateVarcharTableFromCsv] 
    (
     @VarcharCsv VARCHAR(4000) , 
     @Seperator VARCHAR(5) = NULL 
    ) 
RETURNS @VarcharTable TABLE 
    (
     VarcharIndex VARCHAR(50) NOT NULL 
    ) 
AS 
    BEGIN 
     DECLARE @localVarcharIndexList VARCHAR(4000); 
     DECLARE @localSeperator VARCHAR(5); 
     SET @localVarcharIndexList = @VarcharCsv; 
     SET @localSeperator = @Seperator; 
     IF @localSeperator IS NULL 
      SET @localSeperator = ','; 

     /***************************************************************************************** 
     Parse CSVs into tables with CTE 
     http://www.simple-talk.com/sql/t-sql-programming/sql-server-2005-common-table-expressions/ 
     *****************************************************************************************/ 
     IF @localVarcharIndexList IS NOT NULL 
      BEGIN 
       WITH VarcharCsv (i, j, VarcharIndex) 
          AS (SELECT i = 1 , 
             VarcharIndex = CHARINDEX(@localSeperator, 
                   @localVarcharIndexList 
                   + @localSeperator) , 
             SUBSTRING(@localVarcharIndexList, 1, 
                CHARINDEX(@localSeperator, 
                  @localVarcharIndexList 
                  + @localSeperator) 
                - 1) 
           UNION ALL 
           SELECT i = j + 1 , 
             j = CHARINDEX(@localSeperator, 
                 @localVarcharIndexList 
                 + @localSeperator, j + 1) , 
             SUBSTRING(@localVarcharIndexList, 
                j + 1, 
                CHARINDEX(@localSeperator, 
                  @localVarcharIndexList 
                  + @localSeperator, 
                  j + 1) - (j + 1)) 
           FROM  VarcharCsv 
           WHERE CHARINDEX(@localSeperator, 
                @localVarcharIndexList 
                + @localSeperator, j + 1) <> 0 
          ) 
        INSERT INTO @VarcharTable 
          SELECT VarcharIndex 
          FROM VarcharCsv 
        OPTION (MAXRECURSION 500); 
      END; 
     RETURN; 
    END; 

そして、それは私の要件については、次のように使用することができます:

SELECT * 
FROM [tvf_CreateVarcharTableFromCsv]('here is a string 123456 blah blah blah 5/09/2016"', 
             ' ') 
WHERE LEN(VarcharIndex) > 5 
     AND ISNUMERIC(VarcharIndex) = 1 
関連する問題