[ad_1]
式のとき
when (CHARINDEX('₹', @promo_text) > 0 and ISNUMERIC(SUBSTRING(@promo_text, (CHARINDEX('₹', @promo_text)+1),3))=1) then try_cast(try_convert(money,(substring(@promo_text,(charindex('₹', @promo_text)+1),3))) as decimal)
数値または文字列からインドルピー記号 ₹ を抽出するストアド プロシージャが必要です。 例えば。 ₹1258 の割引。出力として 1258 を抽出する必要があります。 SQL SERVER にストアド プロシージャが必要
私が試したこと:
4桁の数字を入力して3桁の出力しか得られない場合、実行中のプロシージャで単一のパラメータを渡します。
また、ストアド プロシージャのパラメータとして列名を渡す方法も必要です
解決策 1
基本的に、データベースを変更します。
数値を文字列として保存しないでください。INT、FLOAT、または DECIMAL として保存します。通貨値には後者が最も適しています。
また、ユーザー入力を検証して変換するときにプレゼンテーション コードの通貨記号を削除して、値の数値のみが DB に到達できるようにします。
そうしないと、問題が発生します。ユーザーが代わりに US$ または £ の値を入力するとどうなるでしょうか。 別の通貨で開始された場合、数値がルピーとして有効ではないため、単に「通貨記号を削除する」ことはできません。これを修正する唯一の方法は、ユーザーがデータを入力した時点です。
そして、後でデータを使用するよりも: 文字列で数学を行うことはできません: したがって、通貨インジケーターを外しても、合計 (たとえば、請求書の販売単位あたりの価格 * ) を計算するたびに、文字列を数値に変換するには、計算を行ってから使用します。その時点で、ユーザーが誤って「₹12,3R,567」と入力したことがわかり、値がどうあるべきかわかりません。 そして、それは数か月後かもしれません!
したがって、常に最も適切な形式でデータを保存してください。数値フィールドには数値、日付/時刻フィールドには日付を指定してください。 これにより、データの整合性が保証され、後で膨大な量の作業を節約できます!
解決策 3
これをチェックしてください:
DECLARE @v NVARCHAR(30) = N'₹1234 discount'; select @v AS InitialValue; select CAST( SUBSTRING(@v, CHARINDEX(N'₹', @v) +1, CHARINDEX(' ', @v) - CHARINDEX(N'₹', @v) ) AS DECIMAL(8,0)) AS Rupees;
[ad_2]
コメント