|
Тема
|
Подредба на резултата според заявката? Как?
|
|
Автор | Ян 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
| |
|
Виж дали Информикса има фунцкия, аналог на 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 |
|
сори, ама не разбрах, че питаш всъщност какво прави декоде, но както виждам вече са го направили ...
| |
|
|
|
|