1

小数が実際には小数ではなく、一種のサブカウントである状況があります。たとえば、薬の処方箋が記入されると、Rx 番号 (345673 としましょう) が与えられます。その番号は、すべてのリフィルを通じて処方箋とともに残り、リフィルは .1、.2 などを追加します。そのため、その Rx 番号の有効期間中、345673、345673.1、345673.2... が続く可能性があります。問題は、.10、.20、.30 などをヒットしたときです。10 進形式では、これらのレコードは .1、.2、.3 と同じです。

これらの数値を追跡し、使用せずに末尾のゼロをサポートする方法はありますVARCHARか? これは主キー列であり、私は Pk で使用することに夢中ではありませんvarchar(それは時代遅れですか?)

すべての提案/ヘルプをいただければ幸いです。

追加する編集:これに別の列を使用できない理由を説明する必要がありました。このデータは別の場所で発生し、一括インポート操作によってデータベースにマージされます。データの多くはオリジンで変更され、次の一括インポートで結合されるため、マージは永続的です。一括インポート/マージを実行するには、Rx 番号が正確に一致する必要があります。

4

2 に答える 2

1

またはをvarchar使用して小数を変換します。その後、、 、などの文字/文字列関数を使用できます。CONVERTCASTLEFT()SUBSTRING()REPLACE()

もう 1 つのオプションは、数学を使用して 10 進数を解析することです。

DECLARE @RxValue decimal(18,4) = 100.234
SELECT @RxValue [Rx Number]
    ,@RxValue - CONVERT(int,@RxValue) [Refill Count Decimal]
    ,LEN(CONVERT(float,(@RxValue - CONVERT(int,@RxValue))))-2 [After Decimal Length]
    ,POWER(10, LEN(@RxValue - CONVERT(int,@RxValue))-2) [Calc multiplier for Refill Count]
    ,CONVERT(int,@RxValue) [Rx ID]
    ,CONVERT(int,(@RxValue - CONVERT(int,@RxValue)) * POWER(10, LEN(CONVERT(float,(@RxValue - CONVERT(int,@RxValue))))-2)) [Refill Count]

上記の選択の最後の 2 つの列は、目的の 2 つの列です。上記のすべては、私が何を考えていたかを見ることができるように、「私の作品を見せる」ための私の試みです. 「-2」は「0」を取り除くことです。LEN()関数の結果から。このPOWER()関数は 10 を取り、それを 10 進数の結果で累乗します。

@RxValueすべての参照を「Rx番号」の列名に置き換えるだけで機能します。試してみたい場合は、値@RxValueを好きなように変更して、結果が期待どおりであることを確認してください。 のデータ型を自分のデータ型に合わせて変更してください@RxValue

もちろん、そのような状況であれば、「Rx 番号」を PK として保持することもできます。派生列をいくつか追加するだけ[Rx ID]です[Refill Count]

質問がある場合は、コメントを残してください。

于 2013-10-30T02:32:10.080 に答える
1

を使用することをお勧めしcomposite primary keyます。おそらく と呼ばれる 2 番目の列を追加し、refillそれを増分値に使用します。そうすれば、両方の列が整数になり、主キーに varchar を使用する必要がなくなります。

フィールドはグループ化では機能しないtriggerため、値を維持するために a を使用する必要がある場合があります。identity

于 2013-10-30T01:56:04.813 に答える