2017-09-12 19 views
3

ポンド記号(#)の後に続くスペースの前にあるSQL Server 2012の文字列から数値を取得しようとしています。たとえば、店舗番号。 、450 768、2、678、5、559、32、67、12、1047、3、17、16SQL - ポンド記号(#)の後の文字列から数値を取得

:私は次のように返します

Big Box Store #450 
Big Box Store #768 
Little Shop #2 
Widgets Warehouse #678 
Little Shop #5 
Widgets Warehouse #559 
Corner Boutiques #32 *CLOSED 
Corner Boutiques #67 *CLOSED 
Corner Boutiques #12 
Buy More #1047 SUPERSTORE 
1 Stop Shop #3 
1 Stop Shop #17 
You 2 Me #16 

:我々は次があるとしましょうあなたが見るように、すべての文字列が最後に数字を持っているわけではありません。その中には店舗名に数字の文字があるものもあります。私はこれについての最善の方法は、ポンド記号の後の数字を抽出することだけです。

これを行う方法はありますか?

Query to get only numbers from a string

https://www.sqlservercentral.com/Forums/Topic456023-338-1.aspx

それはPATINDEXのように思えるが、使用してもいいかもしれませんが、私が試したものを、これまで期待返さないように私にはわからないよ:私は以下の記事を見てきました結果。

多くの感謝!

答えて

1

もう1つの同様の方法... Tyronのテストデータを使用します。数字の後ろにスペースがない場合でも動作します。

DECLARE @t TABLE(
    MyString NVARCHAR(1000) 
); 

INSERT INTO @t VALUES 
('Big Box Store #450') 
,('Big Box Store #768') 
,('Little Shop #2') 
,('Widgets Warehouse #678') 
,('Little Shop #5') 
,('Widgets Warehouse #559') 
,('Corner Boutiques #32*CLOSED') --notice no space here 
,('Corner Boutiques #67 *CLOSED') 
,('Corner Boutiques #12') 
,('Buy More #1047 SUPERSTORE') 
,('1 Stop Shop #3') 
,('1 Stop Shop #17') 
,('You 2 Me #16'); 

select 
    SUBSTRING(MyString,CHARINDEX('#',MyString,0) + 1,case when PATINDEX('%[^0-9]%',RIGHT(MyString,LEN(MyString) - CHARINDEX('#',MyString,0))) = 0 then 99 else PATINDEX('%[^0-9]%',RIGHT(MyString,LEN(MyString) - CHARINDEX('#',MyString,0))) - 1 end) 
    --char version... 
    ,SUBSTRING(MyString,CHARINDEX('#',MyString,0) + 1,case when PATINDEX('%[^0-9]%',substring(MyString,CHARINDEX('#',MyString,0) + 1,LEN(MyString) - CHARINDEX('#',MyString,0) + 1)) = 0 then 99 else PATINDEX('%[^0-9]%',substring(MyString,CHARINDEX('#',MyString,0) + 1,LEN(MyString) - CHARINDEX('#',MyString,0) + 1)) - 1 end) 

from 
    @t 
+0

これは素晴らしいと私はテストし、データセットで動作しますが、私のデータ型はchar(65)です。ソリューションは、varcharsとnvarcharsでのみ動作するように見えます。私は何か間違っているのですか、それとも別の方法がありますか?私はそれらをvarchar(65)に変換するいくつかの "CONVERT"関数を投げましたが、うまくいかなかったのです。ありがとう! – jderekc

+0

@jderekc私は 'CHAR'バージョンを追加しました。 'RIGHT()'関数は 'NVARCHAR'と' VARCHAR'だけを受け入れます。これを 'SUBSTRING'に置き換えました – scsimon

+0

これは完璧です!毎日何か新しいことを学ぶ。助けてくれてありがとう、@scsimon。 – jderekc

1

あなたの要件を満たしているようです。 ;-)

DECLARE @t TABLE(
    MyString NVARCHAR(1000) 
); 

INSERT INTO @t VALUES 
('Big Box Store #450') 
,('Big Box Store #768') 
,('Little Shop #2') 
,('Widgets Warehouse #678') 
,('Little Shop #5') 
,('Widgets Warehouse #559') 
,('Corner Boutiques #32 *CLOSED') 
,('Corner Boutiques #67 *CLOSED') 
,('Corner Boutiques #12') 
,('Buy More #1047 SUPERSTORE') 
,('1 Stop Shop #3') 
,('1 Stop Shop #17') 
,('You 2 Me #16'); 

SELECT MyString 
     ,SUBSTRING(MyString 
       ,CHARINDEX('#', MyString) + 1 
       ,CASE(CHARINDEX(' ', SUBSTRING(MyString 
               ,CHARINDEX('#', MyString) + 1 
               ,LEN(MyString) - CHARINDEX('#', MyString) 
               ) 
           ) 
        ) 
        WHEN 0 THEN LEN(MyString) - CHARINDEX('#', MyString) 
        ELSE CHARINDEX(' ', SUBSTRING(MyString 
               ,CHARINDEX('#', MyString) + 1 
               ,LEN(MyString) - CHARINDEX('#', MyString) 
               ) 
           ) - 1 
        END 
       ) AS MyNumber 
    FROM @t 
+0

これは機能しますが、店舗番号が表示されない場合や、店舗番号と「*閉鎖」タグの間にスペースがないことがあります。しかし、私のデータ型はあなたの解決策で動作するchar(65)ですが、何らかの理由でscsimonのものではありません。 ありがとう! – jderekc

1

これを試してみてください、あなたの疑惑がPATINDEXがソリューションです使用して、正しかった

DECLARE @TABLE AS TABLE(
name_col varchar(250) 
) 

INSERT INTO @TABLE 
SELECT 
'Big Box Store #450' UNION ALL 
SELECT'Big Box Store #768'UNION ALL 
SELECT'Little Shop #2'UNION ALL 
SELECT'Widgets Warehouse #678'UNION ALL 
SELECT'Little Shop #5'UNION ALL 
SELECT'Widgets Warehouse #559'UNION ALL 
SELECT'Corner Boutiques #32 *CLOSED'UNION ALL 
SELECT'Corner Boutiques #67 *CLOSED'UNION ALL 
SELECT'Corner Boutiques #12'UNION ALL 
SELECT'Buy More #1047 SUPERSTORE'UNION ALL 
SELECT'1 Stop Shop #3 132132'UNION ALL 
SELECT'1 Stop Shop #17'UNION ALL 
SELECT'You 2 Me #16' 

SELECT 
LEFT(SUBSTRING(
    SUBSTRING(name_col,CHARINDEX('#',name_col) + 1,LEN(name_col)), 
    PATINDEX('%[0-9.-]%',SUBSTRING(name_col,CHARINDEX('#',name_col) + 1,LEN(name_col))), 8000), 
    PATINDEX('%[^0-9.-]%', SUBSTRING(SUBSTRING(name_col,CHARINDEX('#',name_col) + 1,LEN(name_col)), 
    PATINDEX('%[0-9.-]%', SUBSTRING(name_col,CHARINDEX('#',name_col) + 1,LEN(name_col))), 8000) + 'X') -1) 

FROM @TABLE 

pathindexを使用して、詳細はリンクをチェックしてください。

関連する問題