この質問は見た目よりもトリッキーです。なぜなら、間違ったり、特定のデータ セットでは機能するが、他のデータ セットでは機能しないような方法で記述したりするのは簡単だからです。
これがデータベースに保存しているデータである場合は、データベースの正規化について学ぶことを強くお勧めします. 正規化の原則の 1 つは、1 つの列に 1 つの値のみを格納することです。この場合、日時と整数値を同じ列に格納しています。データを複数の列に格納する方がはるかに優れています。
そうは言っても、データベースにインポートする必要がある生データが与えられる場合があることは知っています。多くの場合、与えられた生データを制御できないため、SQL 体操で間に合わせる必要があります。この特定のケースでは、役立ついくつかの異なるタイプのバックフリップがあります。
- 文字列内の ~ 文字の数を決定します。
- チルダでデータを分割します。
- 値の 1 つが日時であることを確認する
- 他の値が整数であることを確認します。
4 つの項目のうち 1 つだけが SQL Server に組み込まれています。文字列パラメーターを受け取り、文字列で表される日付を日付に変換できるかどうかを示すビットを返す関数名 IsDate があります。
文字列内の ~ の数を決定するには、チルダを使用して文字列の長さを決定し、チルダを使用せずに文字列の長さを決定するのがコツです。これを行うことで、どの行に単一のチルダが含まれているかを判断できます。
When Len(Data) = Len(Replace(Data, '~', '')) + 1
解決が難しいもう 1 つの問題は、文字列が整数を表しているかどうかを判断することです。これには複数の方法がありますが、私のお気に入りの方法は、ハード コードされた値をデータに連結してから、数値をテストすることです。たとえば、IsNumeric 関数は文字列 1e4 に対して true を返します。これは、e が科学表記法を表し、1e4 が 1000 と解釈される可能性があるためです。
IsNumeric(Data + 'e0')
データは 1e4 のようなものになり、数値ではない '1e4e0' を取得するために 'e0' に連結されるため、これは科学表記法の場合は false を返します。同様に、.0 を文字列に連結して、小数をチェックできます。データが 45.2 (数値) で、それに .0 を連結すると、数値ではない '45.2.0' が得られます。テストに「-」を追加して、正の数をチェックすることもできます。'-20' は数値ですが、'-' + '-20' ('--20') は数値ではありません。
Select YourColumnHere,
Len(Replace(YourColumnHere, '~', '')) + 1,
Case When Len(YourColumnHere) = Len(Replace(YourColumnHere, '~', '')) + 1
Then
Case When IsDate(Left(YourColumnHere, CharIndex('~', YourColumnHere)-1)) = 1
Then
Case When Right(YourColumnHere, Len(YourColumnHere)-CharIndex('~', YourColumnHere)) > ''
Then IsNumeric('-' + Right(YourColumnHere, Len(YourColumnHere)-CharIndex('~', YourColumnHere)) + '.0e0')
Else 0
End
Else 0
End
Else 0
End
From YourTableNameHere