-1

次のような文字列が含まれることがあるフィールドがあります。2/23/2013 12:25:55~45

〜で文字列を分割し、〜の左側が有効な日時値であり、〜の右側が有効な整数であるかどうかを識別する必要があります。基本的に私が返したいのは、それらの条件が正しいかどうかの真/偽です。

フィールドにはnullが含まれる可能性があり、他のタイプのデータが含まれる可能性があり、複数のチルダが含まれる可能性があることに注意してください。すべての場合において、私はfalseを返す必要があります。trueを返す必要があるのは、フィールドに日付/時刻の値、単一のチルダ、および整数が含まれている場合のみです。

4

2 に答える 2

2

SQL Server では、次のことができます。

select (case when col like '%~%'
             then (case when isdate(left(col, charindex('~', col) - 1)) = 1 and
                             isnumeric(substring(col, charindex('~', col)+1, 1000)) = 1 and col not like '%~%.%' and col not like '%~%e%'
                        then 1
                        else 0
                   end)
             else 0
       end) as IsFunkyFormat, substring(col, charindex('~', col)+1, 1000), left(col, charindex('~', col) - 1)

ネストされたケースは、セパレーターが見つからない場合のエラーを防ぐためのものです。式は、not like整数ではない数値形式を除外することを目的としています。

于 2013-02-23T21:19:32.877 に答える
0

この質問は見た目よりもトリッキーです。なぜなら、間違ったり、特定のデータ セットでは機能するが、他のデータ セットでは機能しないような方法で記述したりするのは簡単だからです。

これがデータベースに保存しているデータである場合は、データベースの正規化について学ぶことを強くお勧めします. 正規化の原則の 1 つは、1 つの列に 1 つの値のみを格納することです。この場合、日時と整数値を同じ列に格納しています。データを複数の列に格納する方がはるかに優れています。

そうは言っても、データベースにインポートする必要がある生データが与えられる場合があることは知っています。多くの場合、与えられた生データを制御できないため、SQL 体操で間に合わせる必要があります。この特定のケースでは、役立ついくつかの異なるタイプのバックフリップがあります。

  1. 文字列内の ~ 文字の数を決定します。
  2. チルダでデータを分割します。
  3. 値の 1 つが日時であることを確認する
  4. 他の値が整数であることを確認します。

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
于 2013-02-23T21:34:45.017 に答える