文字列値をフローティングなどに変換したい
User entered value Expected Result
1/2 0.5
1 1
1/4 0.25
1 1/2 1.5
SQLサーバーでこの種の値を変換するにはどうすればよいですか?
文字列値をフローティングなどに変換したい
User entered value Expected Result
1/2 0.5
1 1
1/4 0.25
1 1/2 1.5
SQLサーバーでこの種の値を変換するにはどうすればよいですか?
美しくはありませんが、機能します
SELECT CAST(CASE WHEN CHARINDEX('/', val) > 0 THEN SUBSTRING(val, 0, CHARINDEX('/', val))
ELSE val END AS float) /
CAST(CASE WHEN CHARINDEX('/', val) > 0 THEN SUBSTRING(val, CHARINDEX('/', val) + 1, CHARINDEX('/', REVERSE(val)))
ELSE 1 END AS float)
FROM dbo.test12
WHERE CHARINDEX(' ', val) = 0
UNION ALL
SELECT CAST(SUBSTRING(val, 0, CHARINDEX(' ', val)) AS float) +
CAST(SUBSTRING(val, CHARINDEX(' ', val), CHARINDEX('/', val) - CHARINDEX(' ', val)) AS float) /
CAST(SUBSTRING(val, CHARINDEX('/', val) + 1, CHARINDEX('/', REVERSE(val))) AS float)
FROM dbo.test12
WHERE CHARINDEX(' ', val) > 0
この種のことは、GUIで行うのが最適です。式を後でではなく、データベースに入れる前に評価してください。元のユーザー入力を保持したい場合は、いつでもGUIにそれを挿入させることができます。ランダムなユーザー入力を評価することはどのシステムでも危険であるため、データベースの外部で入力を解析および/または評価して、潜在的な影響を制限し、より強力な(または必要に応じて専門性の低い)プログラミングを使用することをお勧めします。 TSQLよりも言語。
そうは言っても、動的SQLを使用して何かを行うことができます(入力が常に表示した形式であると仮定します)。
declare @input varchar(10)
set @input = '1 1/2'
set @input = replace(@input, ' ', '+')
exec('select cast(' + @input + '.0 as float)')
しかし、これには、ユーザー入力の信頼を含む、動的SQLのすべての問題があります。また、TSQL関数で動的SQLを使用することはできないため、クエリで使用するために動的SQLを簡単にまとめることはできません。もちろん、TSQLプロシージャでカーソルを使用したり、CLR関数やストアドプロシージャを記述したりすることもできますが、この種のタスクはデータベースでは場違いに感じられます。ちなみに、この質問は非常に似ています。