2013-01-15 46 views
1

我得在這個數據庫中存儲相同數量的這樣一個領域:從號碼提取分數存儲爲字符串

  • 80 1/4
  • 20 1/8
  • 36 15/16
  • 44 1/8
  • 93 7/8
  • 89 1/8

我想將它們轉換爲完整的小數,所以我可以將它們加起來。我一直試圖通過從數字中提取小數部分來實現這一點,將其轉換爲小數,然後將其加到整數中。我一直在提取分子的一些主要問題。

CASE WHEN CHARINDEX('/',Fraction) > 0 THEN RIGHT(Faction,(LEN(Fraction) - (CHARINDEX('/',Fraction)))) ELSE NULL END AS [Denominator] 

我不知道這是最有效的方式做到這一點,但它似乎工作:分母一直使用提取。

我試着拉了分子使用這種方法:

CASE WHEN Charindex('/', Fraction) > 0 THEN LEFT(RIGHT(Fraction, Len(Fraction) - Charindex(' ',Fraction)), CHARINDEX('/',Fraction) - 1) ELSE NULL END AS [Numerator] 

但是,這只是給我的分數本身。我不確定SQL是否在LEFT中有一個RIGHT問題,因爲它似乎沒有做任何事情,或者更可能是我的代碼搞砸了。

任何人有任何想法?

謝謝!

+0

你想分母和分子分別或整個分數本身?如果它是後者,那麼你可以使用空格而不是正斜槓;-) – bonCodigo

回答

2

你幾乎說得對:你正在計算你錯誤地傳遞給LEFT的長度。你需要考慮空間的位置。

而不是

CHARINDEX('/',Fraction) - 1 

長度應

CHARINDEX('/',Fraction) - CHARINDEX(' ',Fraction) - 1 

整體表現應該是這樣的:

CASE WHEN Charindex('/', Fraction) > 0 THEN LEFT(RIGHT(Fraction, Len(Fraction) - Charindex(' ',Fraction)), CHARINDEX('/',Fraction) - CHARINDEX(' ',Fraction) - 1) ELSE NULL END AS [Numerator] 

Link to demo on sqlfiddle.

0

這裏東西你可以嘗試:

with t as (select '80 123/456' as val) 
select (case when val like '% %/%' 
      then cast(left(val, charindex(' ', val)) as float) + 
        (cast(SUBSTRING(val, charindex(' ', val), CHARINDEX('/', val) - charindex(' ', val)) as float)/
        CAST(SUBSTRING(val, charindex('/', val)+1, 100) as int) 
       ) 
      else cast(val as float) 
     end) 
from t 
1

這應該工作。我搬到了CHARINDEX函數裏面一個apply只是嘗試,使之更加清晰

WITH Data AS 
( SELECT Fraction 
    FROM (VALUES 
       ('80 1/4'), 
       ('20 1/8'), 
       ('20'), 
       ('36 15/16'), 
       ('44 1/8'), 
       ('93 7/8'), 
       ('89 1/8') 
      ) t (Fraction) 
), Workings AS 
( SELECT Fraction, 
      WholeNumber = CAST(CASE WHEN FractionIndex = 0 THEN Fraction ELSE LEFT(Fraction, SpaceIndex) END AS FLOAT), 
      Numerator = CAST(CASE WHEN FractionIndex > 0 THEN SUBSTRING(Fraction, SpaceIndex, FractionIndex - SpaceIndex) END AS FLOAT), 
      Demonimator = CAST(CASE WHEN FractionIndex > 0 THEN SUBSTRING(Fraction, FractionIndex + 1, LEN(Fraction)) END AS FLOAT) 
    FROM Data 
      CROSS APPLY 
      ( SELECT FractionIndex = CHARINDEX('/', Fraction), 
         SpaceIndex = CHARINDEX(' ', Fraction) 
      ) f 
) 
SELECT *, 
     [Decimal] = CAST(WholeNumber + COALESCE(Numerator/Demonimator, 0) AS FLOAT) 
FROM Workings 
0

只要複製你的case語句的部分與你的列名和地點替代變量,其中的「CHARINDEX(」 /',分數)> 0「爲真。

Declare @num varchar(50) = '1004 1/3' 

--  Numerator 
Select Left(Right(@num,Len(@num)-CharIndex(' ',@num)),CharIndex('/',Right(@num,Len(@num)-CharIndex(' ',@num)))-1) 
--  Denominator 
Select Right(Right(@num,Len(@num)-CharIndex(' ',@num)),Len(Right(@num,Len(@num)-CharIndex(' ',@num)))-CharIndex('/',Right(@num,Len(@num)-CharIndex(' ',@num))))