Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 15:05 01.07.24 
Компютри и Интернет
   >> Бази данни
Всички теми Следваща тема *Кратък преглед

Тема Подредба на резултата според заявката? Как?нови  
АвторЯн Coбиeckи 4 (Нерегистриран)
Публикувано25.01.04 22:25



Здравейте!
Някой може ли да отговори на следния въпрос:
Имаме заявка да се изкарат определени данни за зададени ЕГН-та, но проблемът се състои в това че резултата от заявката не е в същата подредба...
или казано иначе:
накрая има условие -
and
(potrebitel.egn LIKE '123456798_' OR potrebitel.egn LIKE '987654321_'
OR potrebitel.egn LIKE '456123789_')
изпълнява я заявката, но не в същия ред като запитването(т.е. първо да даде
за 123456789, след това за 987654321 и накрая за 456123789)
никъв order по никъв признак не може да свърши работа освен по реда на самото запитване..но не знам как....
Благодаря предварително на всеки!
п.с. базата в случая е информикс..ако има значение. ЕГН-то не е целия номер от съображения....



Тема Re: Подредба на резултата според заявката? Как?нови [re: Ян Coбиeckи 4]  
Автор salle (един такъв)
Публикувано26.01.04 11:14



Не знам дали Информикс поддържа сортиране по израз. Това не е според стандарта.

SELECT ...
AND (potrebitel.egn LIKE '123456798_' OR potrebitel.egn LIKE '987654321_' OR potrebitel.egn LIKE '456123789_')

ORDER BY CASE
WHEN potrebitel.egn LIKE '123456798_' THEN 1, WHEN potrebitel.egn LIKE '987654321_' THEN 2

и така нататък
Става и споредица от IF() функции - зависи какво точно поддържа Информикс

Ако не става това нещо го добавяш в SELECT частта с някакво име например
CASE ... AS sort

и накрая сортираш по него.

Ако работиш с точни стойности т.е. = вместо LIKE има и по-елегантно решение е временна таблица с въпросните ЕГН-та и една колонка за подредба към която правиш Join



Тема Re: Подредба на резултата според заявката? Как?нови [re: Ян Coбиeckи 4]  
Автор GolfSynchro (VW фен)
Публикувано26.01.04 18:05



Виж дали Информикса има фунцкия, аналог на decode в Oracle.
Ако работиш с Oracle - следващата заявка ще ти реши проблема
(ако ЕГНто не е в изброените ще ги подреди най-отзад - заради последния параметър - 4, ако го смениш с 0 ще идат преди тези на 123456789)
select * from table_name
where your_where_clause....
and (potrebitel.egn LIKE '123456798_' OR potrebitel.egn LIKE '987654321_'
OR potrebitel.egn LIKE '456123789_') )
order by decode(substr(potrebitel.egn,1,9),'123456798',1,'987654321',2,'456123789',3,4));

Ако нямаш такава функция можеш да я напишеш, като sotred procedure и използваш в заявката.



Тема Re: Би ли обяснил малко по-подробно?нови [re: GolfSynchro]  
Автор salle (един такъв)
Публикувано26.01.04 19:27



1.
order by decode(...)

изисква сървъра да поддържа такъв синтаксис.
Аз го бях написал като "сортиране по израз"

Доколкото помня поне до SQL99 това не е стандартна функция. т.е. стандарта изисква само
ORDER BY име
където "име" е колонка или псевдоним които пък до SQL92 задължително трябва да се появяват в SELECT частта.

2. Какво върши фунцията DECODE() в Oracle?
Тази функция не е стандартна дори в недовършения SQL2003



Тема Re: Би ли обяснил малко по-подробно?нови [re: salle]  
Автор AcidMemory ()
Публикувано26.01.04 19:36



за съжаление decode не е стандартна, както и определена част от оракълския sql (но това се променя, макар и бавно, например в 9-ката най-накрая има стандартен синтаксис за джойн), но пък идеята е ясна и от написаното от двама ви

забележка за decode в order by частта - когато се използва така, оракъл не може да ползва индексите и прави вътрешно сортиране, затова е препоръчително да се ползва само ако се предполага малък resultset



Тема Re: Подредба на резултата според заявката? Как? [re: Ян Coбиeckи 4]  
Автор fiffy ()
Публикувано26.01.04 19:37



Алтернативно, можеш да направиш UNION от 3 заявки за LIKE '123456798_' OR potrebitel.egn LIKE '987654321_' OR potrebitel.egn LIKE '456123789_...

Няма да е оптимално по отношение на скоростта, но ако неможеш да намериш друг вариант, то поне този със сигурност ще работи...

Епа, това е моето хоби...



Тема Re: Добре де Acid и GolfSynchro ...нови [re: AcidMemory]  
Автор salle (един такъв)
Публикувано26.01.04 20:10



... ама какво все пак прави Оракълския DECODE() ?



Тема Re: Добре де Acid и GolfSynchro ...нови [re: salle]  
Автор GolfSynchro (VW фен)
Публикувано27.01.04 09:49



От документацията:
This expression decodes the value deptno. If deptno is 10, the expression evaluates to 'ACCOUNTING'; if deptno is 20, it evaluates to 'RESEARCH'; etc. If deptno is not 10, 20, 30, or 40, the expression returns 'NONE'.

select DECODE (deptno,10, 'ACCOUNTING',
20, 'RESEARCH',
30, 'SALES',
40, 'OPERATION',
'NONE') DEPT_NAME
from dept;
Близко до case-switch - deptno в случая е колоната в базата - Number.
Следващите двойки параметри са стойност-резултат. Последния (NONE) е резултата, за всички неизборени(50 и 60 в примера).

DEPTNO DEPT_NAME
------- ----------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
50 NONE
60 NONE



Тема Re: Добре де Acid и GolfSynchro ...нови [re: salle]  
Автор AcidMemory ()
Публикувано27.01.04 10:10



сори, ама не разбрах, че питаш всъщност какво прави декоде, но както виждам вече са го направили ...




Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.