暂时忽略这1/2
可能意味着between 1 and 2
,您可以处理疯狂并尝试从中获得一些秩序。
CREATE TABLE #Fractions (
Frac varchar(15)
);
INSERT #Fractions VALUES
('1 1/2'), ('1 1/4'), ('1"'), ('1/2'), ('1/4'), ('1/8'),
('2 1/2'), ('2"'), ('3"'), ('3/4'), ('3/8'), ('4"');
WITH Canonical AS (
SELECT
Frac,
F,
CharIndex(' ', F) S,
CharIndex('/', F) D
FROM
(SELECT Frac, Replace(Frac, '"', '') F FROM #Fractions) F
WHERE
F NOT LIKE '%[^0-9 /]%'
), Parts AS (
SELECT
Frac,
Convert(int, Left(F, CASE WHEN D = 0 THEN Len(F) ELSE S END)) W,
Convert(int, CASE WHEN D > 0 THEN Substring(F, S + 1, D - S - 1) ELSE '' END) N,
Convert(int, CASE WHEN D > 0 THEN Substring(F, D + 1, 2147483647) ELSE '1' END) D
FROM Canonical
)
SELECT
Frac,
W + N * 1.0 / D Calc
FROM Parts
ORDER BY Calc;
DROP TABLE #Fractions;
但我不推荐这个。使用我的查询作为基础来获得正确的值,并切换到使用十进制值。
请注意,您还必须在数据中搜索此代码未考虑的字符,使用上面的模式匹配与 LIKE 而不是 NOT LIKE。然后删除它们或以某种方式解释它们。
如果你说的是真的,这1/2
可能意味着两件事,并且你能分辨出它们之间的区别,那么你可以做点什么。将范围存储在两列中。如果它们相同,则没有范围。
如果您无法区分这两种含义之间的区别,那么您只是一团糟,还不如辞掉工作去阿拉斯加赛雪橇犬。