質問

私のデータベース(SQL 2005)にはコメントを保持するフィールドがありますが、コメントにはIDがあり、IDだけを取り除き、可能であればそれをintに変換したいと考えています。

activation successful of id 1010101

上の行は、db フィールドのデータの正確な構造です。

いいえ、アプリケーションのコードでこれを実行したくありません。実際には触りたくないのですが、念のために言っておきます ;-)

役に立ちましたか?

解決

これでうまくいくはずです:

SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999)
FROM table

サンプル データに基づくと、文字列内に整数が 1 つだけ出現し、それが最後にあることがわかります。

他のヒント

現時点ではテストする手段がありませんが、次のとおりです。

select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName

少しコードを書いてみませんか?1 つのオプションとして、CLR ユーザー定義関数を作成し、正規表現を使用します。さらに詳細な情報を見つけることができます ここ. 。これにより、複雑な文字列が処理されます。

上記の行が常に「id ####### のアクティベーションに成功しました」という形式で、フィールドの最後に番号が付いている場合は、次のようになります。

declare @myColumn varchar(100)
set @myColumn = 'activation successful of id 1010102'


SELECT
    @myColumn as [OriginalColumn]
,   CONVERT(int, REVERSE(LEFT(REVERSE(@myColumn), CHARINDEX(' ', REVERSE(@myColumn))))) as [DesiredColumn]

あなたに与えます:

OriginalColumn                           DesiredColumn
---------------------------------------- -------------
activation successful of id 1010102      1010102

(1 row(s) affected)
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)
-- Test table, you will probably use some query  
DECLARE @testTable TABLE(comment VARCHAR(255))  
INSERT INTO @testTable(comment)  
    VALUES ('activation successful of id 1010101')

-- Use Charindex to find "id " then isolate the numeric part  
-- Finally check to make sure the number is numeric before converting  
SELECT CASE WHEN ISNUMERIC(JUSTNUMBER)=1 THEN CAST(JUSTNUMBER AS INTEGER) ELSE -1 END  
FROM (  
       select right(comment, len(comment) - charindex('id ', comment)-2) as justnumber  
       from @testtable) TT

また、このアプローチはよりセットベースであるため、大量のデータ値に対してより効率的であることも付け加えておきます。ただし、変数として 1 つの値だけを指定するのは非常に簡単です。列のコメントを使用する代わりに、次のような変数を使用できます。 @chvComment.

コメント文字列がそのとおりである場合は、replace を使用できます。

select   replace(comment_col, 'activation successful of id ', '') as id from ....

しかし、それはほぼ確実にそうではありません。アクティベーションが失敗した場合はどうなるでしょうか?入れ子になった replace ステートメントが作成される可能性があります

select   replace(replace(comment_col, 'activation not successful of id ', ''), 'activation successful of id ', '') as id from ....

[申し訳ありませんが、この編集画面からはそれが完全に有効な SQL であるかどうかわかりません]

それは面倒になり始めます。関数を作成し、その中に replace ステートメントを入れることを検討するかもしれません。

これが 1 回限りの仕事であれば、特に問題はありません。正規表現を使用することもできますが、これは非常に時間がかかります (いずれにしても、2 つの問題が発生することになります)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top