私のデータベース(SQL 2005)にはコメントを保持するフィールドがありますが、コメントにはIDがあり、IDだけを取り除き、可能な場合はそれをintに変換したいと思います:
activation successful of id 1010101
上記の行は、db フィールドのデータの正確な構造です。
いいえ、アプリケーションのコードでこれを実行したくありません。念のため、実際には触れたくありません ;-)
これでうまくいくはずです:
SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999)
FROM table
サンプル データに基づいて、文字列内に整数が 1 つだけ出現し、それが末尾にあることがわかります。
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)
コメント文字列がまさにそのようなものである場合は、置換を使用できます。
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 つの問題があることを意味します)。
-- 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
。
現時点ではテストする手段はありませんが、次のとおりです。
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)