2

文字列値をフローティングなどに変換したい

User entered value      Expected Result
1/2                     0.5
1                       1
1/4                     0.25
1 1/2                   1.5

SQLサーバーでこの種の値を変換するにはどうすればよいですか?

4

2 に答える 2

0

美しくはありませんが、機能します

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
于 2012-10-05T12:38:20.753 に答える
-1

この種のことは、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関数やストアドプロシージャを記述したりすることもできますが、この種のタスクはデータベースでは場違いに感じられます。ちなみに、この質問は非常に似ています。

于 2012-10-05T20:50:59.760 に答える