2016-03-23 13 views
0

最初の投稿はここにあります。どのような素晴らしいリソース。だれかが助けてくれることを願っています。SQL Server - 文字列に一致するパターン

私はほとんどが数値ではなく全てを含む文字フィールドを持っています。フィールドはdiagと呼ばれ、varchar(8)という形式になっています。それには診断コードが含まれており、時には不一致で入力されています。だから、diagフィールドに29001が表示されることがあります。あるいは私は290.001を見るかもしれません。時には、人々はそれを29000回、29000回、さらには290回とコード化することがあります。それをもっと複雑にするために、フィールドにアルファベット文字をつけて、フィールドにV700.00やH601のようなものを入れることができます。これらを例として使用していますが、これは現場の内容を示しています。

私は29001〜29999の間の診断コードのような値の範囲を見つけようとしています。エントリのコーディングの不一致を考慮して、の値が290.01のレコードを299.99私はただ迷っている。ここ数時間探して、たくさんの情報を見つけましたが、私の質問に答えることはできませんでした。私はSQLにはいくらか新しており、探している値の範囲に一致するレコードを返す方法を理解することはできません。数百万のレコードがあるので、大量のデータです。私はそれを私と一緒に働くことができるものに落とそうとしています。私はSQL Server 2005の古いバージョンを使用しています。

ご協力いただければ幸いです。私は本当にどこから始めるべきか分からない。

ありがとうございました!

答えて

0

このT-SQLを使用して、数字の中で望ましくない文字をすべて削除することができます。あなたのケースで

declare @strText varchar(50) 

--set @strText = '23,112' 
--set @strText = '23Ass112' 
set @strText = '2.3.1.1.2' 

WHILE PATINDEX('%[^0-9]%', @strText) > 0 
    BEGIN 
     SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '') 
    END 
    select @strText 

は、私はあなたが

CREATE Function CleanNumbers(@strText VARCHAR(1000)) 
RETURNS VARCHAR(1000) 
AS 
WHILE PATINDEX('%[^0-9]%', @strText) > 0 
    BEGIN 
     SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '') 
    END 

return @strText 
END 

は、その後、あなたが関数を呼び出し、通常のクエリを作成する必要があります関数を作成することをお勧めします。

WITH CTE as 
(
    SELECT dbo.CleanNumbers(yourtable.YourFakeNumber) as Number, yourtable.* 
    FROM yourtable 
    WHERE YourCriteria = 1 
) 
Select * from CTE where CAST(Number as int) between 29001 and 29999 

それとも簡単に

Select * from yourtable where CAST(dbo.CleanNumbers(YourFakeNumber) as int) between 29001 and 29999 

私は任意のスペルミスを行っていない願っています。)

+0

Licantropo .....あなたの方法は完全に機能しました。あなたのすべての専門家のためのもう1つの質問。ここで私を助けてくれた解決策を一つ修正する必要があります...すでに私に提供していることに加えて、diag変数が数字以外で始まる行を除外できるようにする必要があります。言い換えれば、最初の文字がアルファベットの文字であれば、それを私が戻すものに含めることは望ましくありません。すべてのあなたの助けを非常にありがとう! –

0

あなたは混乱の少しを持っているようですね。分散のルールが分かっている場合は、更新する自動スクリプトを作成できます。しかし、それはかなり緩やかなように聞こえるので、フィールドの有効な値を決定し、そのテーブルを検証し、無効なデータを識別して分類することから始めたいと思うかもしれません。

最初のステップでは、有効な診断コードのリストを取得してテーブルに取得する必要があります。次のようなもの:

CREATE TABLE [dbo].[DiagnosticCodes](
    [DiagnosticCode] [varchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [DiagnosticDescription] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
CONSTRAINT [PK_DiagnosticCodes] PRIMARY KEY CLUSTERED 
    (
     [DiagnosticCode] ASC 
    ) 
) 

次に、有効なコードのリストを取得し、このテーブルにインポートします。

テーブル内の無効なデータを検索する必要があります。これは、すべての無効なコードのテーブルを作成してもあなたが不正なコードからマッピングを移入しますNewCodeというフィールドが含まれ

CREATE TABLE [dbo].[DiagnosticCodesMapping](
    [Diag] [varchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [NewCode] [varchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
CONSTRAINT [PK_DiagnosticCodesMapping] PRIMARY KEY CLUSTERED 
    (
     [Diag] ASC 
    ) 
) 

insert into [dbo].[DiagnosticCodesMapping] 
Select distinct MyDataTable.Diag, null NewCode 
from MyDataTable 
left join DiagnosticCodes 
on MyDataTable.Diag = DiagnosticCodes.DiagnosticCode 
where DiagnosticCodes.DiagnosticCode is null 

:このクエリのようなものは、あなたのデータベース内のすべての無効なコードを与えます新しい有効なコードうまくいけば、このリストは馬鹿馬鹿しくはないでしょう。次に、レビューのためにそれを他の人に渡し、NewCodeフィールドを有効なコードの1つとして入力します。あなたは、有効なコードを持っているすべてのフィールドを取得するために、更新を行うことができ、完全に満たされ、あなたのDiagnosticCodesMappingテーブルを、持っていたら:このようにそれをやって

update MyDataTable 
set Diag=NewCode 
from MyDataTable 
join DiagnosticCodesMapping 
where MyDataTable.Diag = DiagnosticCodesMapping.Diag 

あなたは今、すべてのデータエントリを検証し始めることができるという利点もあり将来このクリーンアップをやり直す必要はありません。 DiagnosticCodeテーブルの有効なコードのみをデータテーブルのDiagフィールドに入力できるようにする制約を作成できます。インタフェースをチェックして、新しいルックアップテーブルも使用するようにしてください。スーパーユーザーに新しいコードを追加する必要がある場合は、DiagnosticCodeテーブルへのデータメンテナンスインターフェイスも作成する必要があります。

関連する問題