4

私は文字列を持っています:

@string='TEST RESULTS\TEST 1\RESULT 1

文字列/テキストは、数字を除いて同じままです

  1. TEST から 1 が必要
  2. RESULT から 1 が必要

次のようなクエリで使用されます。

SET @sql =  "SELECT *
            FROM   TABLE
            WHERE  test = (expression FOR CASE 1 resulting IN INT 1)
                   AND result = (expression FOR CASE 2 resulting IN INT 1)"
4

4 に答える 4

9

ニーズに合ったソリューションが既にあるようですが、文字列から数字を抽出するために使用するちょっとしたトリックがあり、誰かに役立つと思われます。FOR XML ステートメントを利用して、明示的なループを回避します。これは、適切なインライン テーブル関数または単純なスカラーになります。あなたがすることをしてください:)

DECLARE @String varchar(255) = 'This1 Is2 my3 Test4 For Number5 Extr@ct10n';


SELECT
    CAST(( 
        SELECT CASE --// skips alpha. make sure comparison is done on upper case
            WHEN ( ASCII(UPPER(SUBSTRING(@String, Number, 1))) BETWEEN 48 AND 57 )
            THEN SUBSTRING(@String, Number, 1)
            ELSE ''END
        FROM
        ( 
            SELECT TOP 255 --// east way to get a list of numbers
                                           --// change value as needed.
                ROW_NUMBER() OVER ( ORDER BY ( SELECT 1 ) ) AS Number
             FROM master.sys.all_columns a
                CROSS JOIN master.sys.all_columns b 
        ) AS n
        WHERE Number <= LEN(@String)
        --// use xml path to pivot the results to a row
        FOR XML PATH('') ) AS varchar(255)) AS Result

結果 ==> 1234510

于 2013-02-26T15:24:05.003 に答える
3

検索クエリで使用できる SQL 関数をスクリプト化できます。これがサンプルコードです。

CREATE FUNCTION udf_extractInteger(@string VARCHAR(2000))
RETURNS VARCHAR(2000)
    AS

    BEGIN
        DECLARE @count int
        DECLARE @intNumbers VARCHAR(1000)
        SET @count = 0
        SET @intNumbers = ''

        WHILE @count <= LEN(@string)
        BEGIN 
            IF SUBSTRING(@string, @count, 1)>='0' and SUBSTRING (@string, @count, 1) <='9'
                BEGIN
                    SET @intNumbers = @intNumbers + SUBSTRING (@string, @count, 1)
                END
            SET @count = @count + 1
        END
        RETURN @intNumbers
    END
    GO

クエリ:

SELECT dbo.udf_extractInteger('hello 123 world456') As output

出力: 123456

参照元: http://www.ittutorials.in/source/sql/sql-function-to-extract-only-numbers-from-string.aspx

于 2014-09-18T10:05:45.823 に答える
1

安定したテキストと 2 つの要素しかないため、 replaceparsenameをうまく利用できます。

declare @string varchar(100) = 'TEST RESULTS\TEST 1\RESULT 2'

select cast(parsename(replace(replace(@string, 'TEST RESULTS\TEST ', ''), '\RESULT ', '.'), 2) as int) as Test
    , cast(parsename(replace(replace(@string, 'TEST RESULTS\TEST ', ''), '\RESULT ', '.'), 1) as int) as Result

/*
       Test      Result
----------- -----------
          1           2
*/

置換部分は、常に同じテキストとスペーシングを想定し、パースネームをピリオドで設定します。

于 2013-02-05T04:49:30.640 に答える
0

この方法ではSUBSTRINGPARSENAME、 、および を使用しPATINDEXます。

SELECT 
  SUBSTRING(PARSENAME(c,2), PATINDEX('%[0-9]%',PARSENAME(c,2)), LEN(c)) Test,
  SUBSTRING(PARSENAME(c,1), PATINDEX('%[0-9]%',PARSENAME(c,1)), LEN(c)) Result
FROM (   SELECT REPLACE(@val, '\', '.') c) t

PARSENAME文字列を分割するために使用します。文字列のテキストは重要ではありません。3 つの要素に解析するには、2 つのバック スラッシュを含める必要があります。PATINDEX結果から数値以外の値を置き換えるには、正規表現とともに使用します。数字の前のテキストに数字が含まれていた場合は、これを調整する必要があります。

必要に応じて、結果を int または適切なデータ型に CAST/CONVERT します。

ここにいくつかのサンプルFiddleがあります。

幸運を。

于 2013-02-05T05:03:24.867 に答える