ورود

View Full Version : مشکل در مرتب سازی چند رکورد nvarchar



navidkhalilian
پنج شنبه 18 فروردین 1390, 16:56 عصر
سلام دوستان.همگی خسته نباشید.من قصد دارم جدولی را که شامل پنج فیلد هست رو مرتب کنم(Order By) اما به مشکل برخوردم از همه دوستان خواهش می کنم در صورت امکان کمک کنند.

جدول شامل 5 فیلد به نام های a-b-c-d-e هست.
همه فیلد ها باید nvarchar باشند.
طول فیلد ها هم 6 کاراکتر هست.

داخل تصویر ضمیمه ببینید فیلد قرمز رنگ باید بعد از فیلد آبی رنگ نمایش داده بشه اما در صورتی این اتفاق می افته که فیلد از نوع int باشه اما من به دلایلی مجبورم از nvarchar استفاده کنم.(دلیلش اینه که امکان داره کاربر به جای 1 مقداره 1/1 را وارد کنه یا مثلا 1/2).

امیدوارم که دوستان بتونند راهنمایی کنند.تشکر

محمد سلیم آبادی
پنج شنبه 18 فروردین 1390, 17:33 عصر
اینو امتحان کنید:

ORDER BY LEN(a), a, LEN(b), b, LEN(c), c, LEN(d), d, LEN(e), e;

navidkhalilian
پنج شنبه 18 فروردین 1390, 17:44 عصر
سلام دوست من ممنونم از کمکت.تا حدودی درست شد اما باز مشکل اصلی حل نشده.
یک رکورد با مقادیر زیر پر کنید و نتیجه را ببینید.
a=1
b=1
c=1
d=1/1
e=1
این رکورد باید چهارمین رکورد باشه طبق عکس بالا.ممنون

محمد سلیم آبادی
پنج شنبه 18 فروردین 1390, 19:44 عصر
یعنی 1/1 باید بزرگتر از 1 در نظر گرفته بشه؟ همینطور 1/2 بزرگتر از 1/1؟

محمد سلیم آبادی
پنج شنبه 18 فروردین 1390, 20:00 عصر
این کوئری رو استفاده کنید و بررسی کنید که آیا دقیقا همون نتیجه مورد نظر و مطلوبتان را تولید می کند یا خیر:

declare @t table
(a varchar(10),
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10));

insert @t
values ('1','1','1','1','1'),
('1','1','1','1','2'),
('1','1','1','1','3'),
('1','1','1','1/1','1'),
('1','1','1','10','1'),
('1','1','1','9','1');

SELECT a, b, c ,d ,e
FROM (SELECT CASE WHEN CHARINDEX('/', a) = 0 THEN a + '/0' ELSE a END AS a1,
CASE WHEN CHARINDEX('/', b) = 0 THEN b + '/0' ELSE b END AS b1,
CASE WHEN CHARINDEX('/', c) = 0 THEN c + '/0' ELSE c END AS c1,
CASE WHEN CHARINDEX('/', d) = 0 THEN d + '/0' ELSE d END AS d1,
CASE WHEN CHARINDEX('/', e) = 0 THEN e + '/0' ELSE e END AS e1, *
FROM @t) AS D
ORDER BY LEN(a1), a1, LEN(b1), b1, LEN(c1), c1, LEN(d1), d1, LEN(e1), e1;

/*
a b c d e
---------- ---------- ---------- ---------- ----------
1 1 1 1 1
1 1 1 1 2
1 1 1 1 3
1 1 1 1/1 1
1 1 1 9 1
1 1 1 10 1
*/

محمد سلیم آبادی
پنج شنبه 18 فروردین 1390, 20:20 عصر
اگر بازم داده هایتون می تونه پیچیده تر از این حرفا باشه دو روش زیر هم می تونید امتحان کنید:

declare @t table
(a varchar(10),
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10));

insert @t
values ('1','1','1','1','1'),
('1','1','1','2/1000','2'),
('1','1','1','1','3'),
('1','1','1','1/1','1'),
('1','1','1','99/0','1'),
('1','1','1','9','1');

--msalim 01
SELECT a, b, c ,d ,e
FROM (SELECT CASE WHEN CHARINDEX('/', a) = 0 THEN a + '/0' ELSE a END AS a1,
CASE WHEN CHARINDEX('/', b) = 0 THEN b + '/0' ELSE b END AS b1,
CASE WHEN CHARINDEX('/', c) = 0 THEN c + '/0' ELSE c END AS c1,
CASE WHEN CHARINDEX('/', d) = 0 THEN d + '/0' ELSE d END AS d1,
CASE WHEN CHARINDEX('/', e) = 0 THEN e + '/0' ELSE e END AS e1, *
FROM @t) AS D
ORDER BY LEN(LEFT(a1, CHARINDEX('/', a1))), LEFT(a1, CHARINDEX('/', a1)),
LEN(RIGHT(a1, LEN(a1) - CHARINDEX('/', a1))), RIGHT(a1, LEN(a1) - CHARINDEX('/', a1)),
LEN(LEFT(b1, CHARINDEX('/', b1))), LEFT(b1, CHARINDEX('/', b1)),
LEN(RIGHT(b1, LEN(b1) - CHARINDEX('/', b1))), RIGHT(b1, LEN(b1) - CHARINDEX('/', b1)),
LEN(LEFT(c1, CHARINDEX('/', c1))), LEFT(c1, CHARINDEX('/', c1)),
LEN(RIGHT(c1, LEN(c1) - CHARINDEX('/', c1))), RIGHT(c1, LEN(c1) - CHARINDEX('/', c1)),
LEN(LEFT(d1, CHARINDEX('/', d1))), LEFT(d1, CHARINDEX('/', d1)),
LEN(RIGHT(d1, LEN(d1) - CHARINDEX('/', d1))), RIGHT(d1, LEN(d1) - CHARINDEX('/', d1)),
LEN(LEFT(e1, CHARINDEX('/', e1))), LEFT(e1, CHARINDEX('/', e1)),
LEN(RIGHT(e1, LEN(e1) - CHARINDEX('/', e1))), RIGHT(e1, LEN(e1) - CHARINDEX('/', e1));

--msalim 02
SELECT a, b, c ,d ,e
FROM (SELECT CASE WHEN CHARINDEX('/', a) = 0 THEN a + '/0' ELSE a END AS a1,
CASE WHEN CHARINDEX('/', b) = 0 THEN b + '/0' ELSE b END AS b1,
CASE WHEN CHARINDEX('/', c) = 0 THEN c + '/0' ELSE c END AS c1,
CASE WHEN CHARINDEX('/', d) = 0 THEN d + '/0' ELSE d END AS d1,
CASE WHEN CHARINDEX('/', e) = 0 THEN e + '/0' ELSE e END AS e1, *
FROM @t) AS D
ORDER BY LEFT(a1, CHARINDEX('/', a1) - 1) * 1, RIGHT(a1, LEN(a1) - CHARINDEX('/', a1)) * 1,
LEFT(b1, CHARINDEX('/', b1) - 1) * 1, RIGHT(b1, LEN(b1) - CHARINDEX('/', b1)) * 1,
LEFT(c1, CHARINDEX('/', c1) - 1) * 1, RIGHT(c1, LEN(c1) - CHARINDEX('/', c1)) * 1,
LEFT(d1, CHARINDEX('/', d1) - 1) * 1, RIGHT(d1, LEN(d1) - CHARINDEX('/', d1)) * 1,
LEFT(e1, CHARINDEX('/', e1) - 1) * 1, RIGHT(e1, LEN(e1) - CHARINDEX('/', e1)) * 1;
/*
a b c d e
---------- ---------- ---------- ---------- ----------
1 1 1 1 1
1 1 1 1 3
1 1 1 1/1 1
1 1 1 2/1000 2
1 1 1 9 1
1 1 1 99/0 1
*/