我有一个ASP.NET应用程序,它将数据从Oracle表中提取到GridView中。我完全无法控制Oracle数据,它就是这样(行号表示部分工具包一起放入运输包中,我不知道是谁使用加倍的小数)。
数据看起来像这样,加倍的小数点是问题(这是数千行数据的一个小例子):
LINE_NUMBER
1.1
10.1
11.1
2.1
2.1..1
2.1..2
3.1
4.1
5.1
6.1
7.1
8.1
8.1..1
8.1..2
9.1
我需要这样订购:
LINE_NUMBER
1.1
2.1
2.1..1
2.1..2
3.1
4.1
5.1
6.1
7.1
8.1
8.1..1
8.1..2
9.1
10.1
11.1
我已经尝试用LPAD填充条目(LINE_NUMBER,9,'0'),但由于时间加倍,我仍然得到一个不稳定的类型。 See this SO question
我已经尝试过REGEXP_REPLACE(LINE_NUMBER,'..','')来彻底删除双重句号,但这也不起作用。我认为这可能是Oracle的答案所在,但我是一个完整的Oracle noob,虽然我对MySQL / MariaDB& amp; MS SQL。
我也尝试了REGEXP_SUBSTR as shown in this site,但我不能让他的榜样为我工作。
我也尝试了this SO question中显示的技术,但是当它处理多个小数点时,它并不处理彼此相邻的倍数。
我想如果我可以简单地删除双倍期(或者可能只是在第一个之后的所有尾随期间?),我可以得到正确的排序。我可以简单地选择同一列数据的另一个副本,删除双重句点和ORDER BY那一列而不是GridView中的LINE_NUMBER。双小数点并不重要,如果它们被删除,字符串就会成为一个浮点数,我可以用数字排序(我想)。
除非有一个相对简单的基于Oracle的方法,否则我可能会操纵后面代码中的数据表来分割双倍的字符串并找出如何在那里应用排序。
正如我之前所说,我无法控制Oracle数据,我只能查询,而不能写入数据库。
在回答问题时,这里列出了可能的字符串。请注意,这并非详尽无遗,只是可能的例子。也有可能(但非常不可能),任何数字都可以变为三位数:
9.1
41.1
1.1..1
1.1..15
10.1..1
15.1..3
2.1..1
2.1..10
2.1..2
21.1..1
23.1..10
23.1..2
3.1..1
30.1..1
31.1..1
4.1..1
9.1..10
9.1..2
可能的例子,但不太可能:
123.345..678
第一个数字是包裹的“发货集”,第二个数字是发货集中的工具包,而小数点后面的第三个数字(如果存在)是物料清单中的行项目。根据我的用户,任何超过两位数的可能性很小,但并非不可能。
答案 0 :(得分:4)
尝试:
std::map<int, std::vector<char> > getCodeMap_internal()
{
static char _identificationCodeChars[][2] =
{
{ ' ', ' ' },
{ 'S', '6' },
{ 'Z', 'U' }
} ;
std::map<int, std::vector<char> > _trackTypeToIdentificationCodeMap;
for ( int i = 0 ; i < sizeof( _identificationCodeChars ) / sizeof( _identificationCodeChars[0] ) ; i++ )
{
std::vector<char> vec ;
vec.push_back( _identificationCodeChars[i][0] ) ;
vec.push_back( _identificationCodeChars[i][1] ) ;
_trackTypeToIdentificationCodeMap[i] = vec ;
}
return _trackTypeToIdentificationCodeMap;
}
const std::map<int, std::vector<char> >& getCodeMap()
{
static std::map<int, std::vector<char> > _trackTypeToIdentificationCodeMap
= getCodeMap_internal();
return _trackTypeToIdentificationCodeMap;
}
演示:http://sqlfiddle.com/#!4/1786b/11
SELECT LINE_NUMBER,
LINE_NUM
FROM (
SELECT LINE_NUMBER,
replace( Line_number, '..', '.' ) As Line_num
FROM table1
)
ORDER BY
to_number(regexp_substr( Line_num, '\d+', 1, 1)) NULLS FIRST,
to_number(regexp_substr( Line_num, '\d+', 1, 2)) NULLS FIRST,
to_number(regexp_substr( Line_num, '\d+', 1, 3)) NULLS FIRST,
to_number(regexp_substr( Line_num, '\d+', 1, 4)) NULLS FIRST
;