暂时忽略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
可能意味着两件事,你可以分辨它们之间的差异,那么你可以做一些事情。将范围存储在两列中。如果他们是相同的,那么就没有范围。
如果你不能区分这两种意义之间的区别,那么你只是大大搞砸了,不如放弃你的工作,去阿拉斯加参加比赛雪橇犬。
请提供样品数据和所需的输出。 – RedFilter 2012-07-18 14:14:26
你只是想排序列表?你有什么理由要用数据库来做到这一点?这个列表中是否有重复项? – 2012-07-18 14:15:57
我建议你在你的数据库查询顺序DisplayOrder asc – HatSoft 2012-07-18 14:16:40