sql de order by null alanlarda çalışmıyor

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

sql de order by null alanlarda çalışmıyor

Mesaj gönderen musti »

S.a

Bir turlu yapamadım yardımcı olurmusunuz order by neden null alanları en basa atmıyor

oncelik le fisnoya gore sıralayacak
sonra borc alanı dolu olanlar koda gore sıralı olacak
sonra alacak alanı koda gore sıralı olacak

Kod: Tümünü seç

select fisno,kodu,borc,alacak from tablo
order by 1,3,2,4 

dedeğim zaman tamama yakın ama bu sefer borc alanına gore siraladıgı için kodu alanı sırası bozuluyor.

aslinda union la bu isi cozuyorum (once borcu is not null sorna alacagı is not null diyerek order by calisinca)ama uzun oluyor tek order ile bu iş omazmı


alanlar fisno,kodu,borc,alacak
sonuc soyle alacak

Kod: Tümünü seç

1,A100,   10,  null 
1,A200,   20,  null
1,A300,   30,  null
1,A050,  null,  10
1,A200,  null,  20
onaydin

Mesaj gönderen onaydin »

New NULL order handling
Allow user-defined ordering of NULLs. Default behaviour is NULLS LAST.

Syntax:

[ORDER BY <order_list>]
<order_list> = {col | int} [COLLATE collation]
[ASC[ENDING] | DESC[ENDING]] [NULLS {FIRST | LAST}]
[, <order_list> ...]Example:

ORDER BY NAME DESCENDING NULLS FIRST
Firebird ön tanımlı olarak null değerleri en sona atıyormuş, fb 1.5 ile bu sıralamayı kullanıcının talebine göre belirlemek mümkünmüş; nulls first demek yeterli (Dialect 3 için).
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

tksler
ama sorunum bu sefer de alacak alanını sıraya koydugu icin kodu alanı indekse girmiyor.

yani once borc hesabı dolu olanları koduna gore indexleyece
sonra alacak alanı dolu olanları koduna gore indexleyece
onaydin

Mesaj gönderen onaydin »

FB kurulu olmadığından deneyemiyorum.

Kod: Tümünü seç

kodu nulls LAST, alacak nulls FIRST
gibi bir kod çalışıyor mu? Çalışıyorsa almak istediğiniz sonucu veriyor mu?
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

tabi tabi calisiyor ama sonuc istedigim degil
cunku
alacakga gore once nulları sonra rakamları indexledigi icin alacakdaki rakamın karsısaki kod buyuk oldugu zaman yanlis cikar

ornek
a100,nul
a100, 20
a200, 10

diyince a200 basa atiyor oysa once null sonra kodlar sıralı olmalı
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba,

şuan bende deneme şansım yok ama şöyle bir yol olabilirmi,

Kod: Tümünü seç


order by alan1, alan2, alan3

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

sayın kıdemli uye abi
mesajı okumadan yazmıssınız sanırım :)
tsk ederim ilginiz ama abicim ben order alan1,alan2,... ile bun cozme sansım yok



sanırım yyine union ile cozecez
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

COALESCE kullanarak çözmeyi deneyin.
Örneğin:

Kod: Tümünü seç

Select ALAN1, COALESCE(ALAN2, ''), ALAN3 FROM TABLE_A
ORDER BY 1,2,3
 
NULL değerlerin sonda gelmesini istediğin yerlerde COALESCE kullanmazsın.

İyi çalışmalar.
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

yok hocam
onuda denedim olmuyor

ya soyle bir komut yok mu
borcu olanların kodlarını indexle
sonra alacagı olanları kodlarını indexle

union gibi yani
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

NULL sıfır gibi düşünülse de sıralamada bütün değerlerden sonra gelir :idea: Buna göre sorguyu;

Kod: Tümünü seç

select fisno,kodu,coalesce(borc, 0), coalesce(alacak, 0) from tablo
order by 1,3,2,4
şeklinde yazarsan sorunsuz çalışacaktır. Gerçek sıfırlardan ayırt etmek için 0 (sıfır) yerine -eğer sıfır da dönebiliyorsa- -1 (eksi bir) veya başka bir eksi değer verebilirsin :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

ilginiz icin tsk ederim

olay union ile cozulmusmus,

once borcu olanları aldım ve kodua gore indekledim
sonra alacagı olanları.

ama guzel olan birsey sizden yine cok sey ogrendim tskler
Cevapla