2017-09-18 8 views
1

私の古いデータベースには、数値と文字が結合された値を持つカラムはほとんどありません。これは、私が新しいテーブルできれいにしてインポートする必要があるものです。その上40Aまたは3Rと:ユーザーがまだのような値であることができますが、古いシステムに入力することができますどのような任意の検証がなかったので値の文字をトリム/置換する方法は?

40M or 85M or NR or 5NR ... 

:このような外観を変換する必要がある値のほとんど。私は新しいテーブルの数値だけをインポートしたい。だから、値に文字があれば、私はそれらをトリミングしたい。 SQL Serverでこれを行う最善の方法は何ですか?私はこれを試しました:

CASE WHEN CHARINDEX('M',hs_ptr1) <> 0 THEN 1 ELSE 0 END AS hs_ptr1 

しかし、これは1文字が値にあるかどうかを特定するだけです。誰かが助けてくれたら教えてください。ありがとう!

+1

あなたのGoogle検索文字列は、SQLサーバーのpatindex' 'です....機能のない方法です。 –

+0

[T-SQLで非数値文字を削除するクエリを選択しました](https://stackoverflow.com/questions/18625548/t-sql-select-query-to-remove-non-numeric-characters) –

答えて

1

patindexを使用してパターンを検索することができます。このコードを試してみてください。

コード:

CREATE TABLE #temp 
(
     TXT NVARCHAR(50) 
) 

INSERT INTO #temp (TXT) 
VALUES 
    ('40M'), 
    ('85M'), 
    ('NR'), 
    ('5NR') 

SELECT LEFT(subsrt, PATINDEX('%[^0-9]%', subsrt + 't') - 1) 
FROM (
    SELECT subsrt = SUBSTRING(TXT, pos, LEN(TXT)) 
    FROM (
     SELECT TXT, pos = PATINDEX('%[0-9]%', TXT) 
     FROM #temp 
    ) d 
) t 

DROP TABLE #temp 
0

あなたがPATINDEX functionで行くと数字以外の文字を検索します。このようなインデックスが存在する場合は、そのすべてのインデックスを取得します。そのような何か:

SELECT LEFT(your_field_name, PATINDEX("%[^0-9]%", your_field_name) - 1) 
FROM your_table_name 

UPDATE

さて、あなたは、任意のエッジケースの世話をする必要があります。例えば。非数字データがない場合、関数は0を返します。したがって、計算結果は-1になります。実際には無効な長さです。

Common Table Expressionを利用して非数字データのインデックスを計算し、正しい文字データを選択するためにIIF expressionを作成することをお勧めします。例えば。

WITH cte AS 
(
    SELECT *, PATINDEX("%[^0-9]%", your_field_name) AS NumLength 
    FROM your_table_name 
) 
SELECT any_other_field, IIF(NumLength = 0, 
    your_field_name, 
    LEFT(your_field_name, PATINDEX("%[^0-9]%", your_field_name) - 1) 
) 
FROM cte 
+0

Iエラーメッセージが表示されます:無効な長さのパラメーターがSUBSTRING関数に渡されました。 –

1

はここ

declare @table table (c varchar(256)) 
insert into @table 
values 
('40M'), 
('30'), 
('5NR'), 
('3(-4_') 

select 
replace(LEFT(SUBSTRING(replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',',''), PATINDEX('%[0-9.-]%', replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',','')), 8000), 
      PATINDEX('%[^0-9.-]%', SUBSTRING(replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',',''), PATINDEX('%[0-9.-]%', replace(replace(replace(replace(replace(c,'(',''),')',''),'-',''),' ',''),',','')), 8000) + 'X') -1),'.','') 
from @table 
関連する問題