string alanı saysal gibi sıralama

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

Kod: Tümünü seç

  WHEN STRLEN(URUN_KODU) = 1 THEN '000000000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 2 THEN '00000000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 3 THEN '0000000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 4 THEN '000000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 5 THEN '00000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 6 THEN '0000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 7 THEN '000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 8 THEN '00' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 9 THEN '0' || URUN_KODU 
bu kısım

Kod: Tümünü seç

SUBSTR('000000000',1,9 - strlen(URUN_KODU)) || URUN_KODU
Bu şekilde de yazılabiliyor galiba.
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

ASE yazdı:
Terminator yazdı:çözümsüz bir işlem değil gayet basit,
ama arkadaş yanlış bölgede salyangoz satıyor,
burası firebird tarikatının tekkesi.
kendisine M$sql veya diğer veritabanları forumunu salık veririm.
access ticari biri üründür, satan ve desteğini veren bill abidir.

@Terminator: Kusura bakma ama anlayamadım. Bu lafın kimeydi. Bana mı. Eğer banaysa ben yanlış yerde aramıyorum çözümü. Forum taşınırken bu başlık accessle ilgili olmasına rağmen buraya taşınmış ben de altına devam ettim.

Değilse yine kusura bakma. Zaten bu soruya özellikle senevap vereceğini düşünmüştüm...
A! hakkatan baya eski bir topici bulup devam etmişsin, ben tarihlere bakmıyorum bile.
keşke yeni bir topic açıp o şekilde sorsaydın madem o son kullanma tarihi bile geçmiş topicteki mesajlar senin işini görmedi...
Firebird Foundation Member #208
http://www.firebirdsql.org
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

onaydin yazdı:

Kod: Tümünü seç

  WHEN STRLEN(URUN_KODU) = 1 THEN '000000000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 2 THEN '00000000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 3 THEN '0000000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 4 THEN '000000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 5 THEN '00000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 6 THEN '0000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 7 THEN '000' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 8 THEN '00' || URUN_KODU 
    WHEN STRLEN(URUN_KODU) = 9 THEN '0' || URUN_KODU 
bu kısım

Kod: Tümünü seç

SUBSTR('000000000',1,9 - strlen(URUN_KODU)) || URUN_KODU
Bu şekilde de yazılabiliyor galiba.
ASE ye ithaf olunur:

substr ve strlen UDF fonksiyonlarıdır, UDF ile sola padding yapan daha kullanışlı fonksiyonlar vardır. UDF kullanmadan tamamen builtin FB kaynaklarıyla notasyon düzenlemesi yapmak istersen:
URUN_KODU 9 karakter için:

CASE
WHEN substring(URUN_KODU FROM 1 FOR 1)='' THEN '.........'
WHEN substring(URUN_KODU FROM 2 FOR 1)='' THEN '........'
WHEN substring(URUN_KODU FROM 3 FOR 1)='' THEN '.......'
WHEN substring(URUN_KODU FROM 4 FOR 1)='' THEN '......'
WHEN substring(URUN_KODU FROM 5 FOR 1)='' THEN '.....'
WHEN substring(URUN_KODU FROM 6 FOR 1)='' THEN '....'
WHEN substring(URUN_KODU FROM 7 FOR 1)='' THEN '...'
WHEN substring(URUN_KODU FROM 8 FOR 1)='' THEN '..'
WHEN substring(URUN_KODU FROM 9 FOR 1)='' THEN '.'
ELSE ''
END || URUN_KODU

nokta yerine boşluk ya da altçizgi ya da herhangi bi karakter kullanabilirsin.
Not: aceleyle yazdığım için kodu 1-2 defa editledim kusura bakmayın erken okuyanlar..
En son Terminator tarafından 09 Şub 2006 12:58 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Firebird Foundation Member #208
http://www.firebirdsql.org
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

Neyi niye ithaf ediyor anlamadım :roll:
'Sola padding yapmanın' farklı yolları olabilir, ben bunu kullanıyorum. Gelişmiş fonksiyon kütüphanesi olan veritabanlarında bu işlemi yapmak için daha farklı fonksiyonlarda mevcut :).
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

onaydin yazdı:Neyi niye ithaf ediyor anlamadım :roll:
'Sola padding yapmanın' farklı yolları olabilir, ben bunu kullanıyorum. Gelişmiş fonksiyon kütüphanesi olan veritabanlarında bu işlemi yapmak için daha farklı fonksiyonlarda mevcut :).
ASE nin sorusunu access sorusu sanıp cevap vermemiştik,
o yüzden ithaf ettik.(dedication)

sen onu kullan, kimse seni eleştirmiyor, söylediğim alternatif öneriydi.
Gelişmiş fonksiyon kütüphanesi FB de de var, sadece hazır bir scripti çalıştırmak gerekiyor, ve bu, ihtiyaç duymayanlar için daha esnek bir çözüm. ileriki versiyonlarda builtin hazır fonksiyonlar için belden aşağı vurmak zor olmayacak FB için, ama herkes istediğini kullanmakta özgür.
buraya gelip FBle ilgileneniyoruz madem, FBden konuşmalıyız.
benim 16 sene önce kullandığım oracle bile builtin fonksiyon olarak FB nin şuanki halinden daha zengindi, ama bu beni bağlayan bir kriter değil.

bazen daha uzun gibi görünen komutlar aslında daha hızlı ve optimistiktir,
bazen de kısa gibi görünen komutlar daha pesimistik ve masraflıdır.
farkı, bütün kodu kafamızda makina koduna dönüştürüp analiz ederek görebiliriz. high level programcılar için ise, fark önemli değildir, fonksiyonellik yeterlidir.

ayrıca, ASE bu işlemi bir computed saha ekleyerek tablosuna koyabilir ve
her seferinde yazmadan, doğrudan o kolonu sıralama için kullanabilir eğer çok sık lazım oluyorsa.
ama ben olsam hiç bu tip veri tasarımlarına kalkışmam bile, o ayrı konu.
Firebird Foundation Member #208
http://www.firebirdsql.org
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Arkadaşlar peki bu alanı bu şekilde seçmek yerine bi kere update etsek 5 rakama tamamla gibi ve sonrasında beforeinsert te hep 5 rakama tamamlatsak da kolay olmaz mıydı. bunun için bi update yöntemi var mı acaba
Kolay gelsin
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

ASE yazdı:Arkadaşlar peki bu alanı bu şekilde seçmek yerine bi kere update etsek 5 rakama tamamla gibi ve sonrasında beforeinsert te hep 5 rakama tamamlatsak da kolay olmaz mıydı. bunun için bi update yöntemi var mı acaba
Kolay gelsin
bunu sormanı külliyen yadırgadım ASE. ;)

update TABLEOFASE
SET URUN_KODU=
CASE
WHEN substring(URUN_KODU FROM 1 FOR 1)='' THEN '.....'
WHEN substring(URUN_KODU FROM 2 FOR 1)='' THEN '....'
WHEN substring(URUN_KODU FROM 3 FOR 1)='' THEN '...'
WHEN substring(URUN_KODU FROM 4 FOR 1)='' THEN '..'
WHEN substring(URUN_KODU FROM 5 FOR 1)='' THEN '.'
ELSE ''
END || URUN_KODU ;

not: önce yedek veritabanında deneyip kodun düzgün çalıştığından emin ol öyle kullan. çok fazla kontrol etmedim yazdığımı, amacım sadece yöntemi göstermek.
Firebird Foundation Member #208
http://www.firebirdsql.org
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Terminator yazdı: bunu sormanı külliyen yadırgadım ASE. ;)
Valla ben daha çok yadırgadım ama çalıştıramdım. Sağol şimdilik denem imkanım yok. Akşam benzer şeyler yazdım çalışmamıştı. Bu akşam tekrar deneyeceğim.
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

Pardon, düzeltiyorum:

update STOK
SET URUN_KODU=
CASE
WHEN substring(URUN_KODU From 1 For 1)='' THEN '.....' || URUN_KODU
WHEN substring(URUN_KODU FROM 2 FOR 1)='' THEN '....' || URUN_KODU
WHEN substring(URUN_KODU FROM 3 FOR 1)='' THEN '...' || URUN_KODU
WHEN substring(URUN_KODU FROM 4 FOR 1)='' THEN '..' || URUN_KODU
WHEN substring(URUN_KODU FROM 5 FOR 1)='' THEN '.' || URUN_KODU
ELSE URUN_KODU
END

çalışmama sebebi şu:
THEN den sonra yazdığımız literal stringler aynı boyda geri dönüyor.
çünkü FB literal stringleri char tipinde değerlendirir varchar değil.
Case fonksiyonu tümünü aynı boya getirdiği için (çünkü aynı kolon bilgisini geri döndürüyor) otomatik olarak char(5) dönüyor.
ordan dönen char(5) space padded ve sizin urun_kodu da en azından birkaç karakter içerdiği için taşma oluyor.
ya, cast('...' as varchar(3)) gibi bir tip ataması yaparak döndürmeliyiz,
ya da concatenate işlemini fonksiyonun içinde yapmalıyız ki, dönen sonuç
atamayı yapacağımız 5 karakterlik sahayı taşırmasın.

Kolay gelsin.
Firebird Foundation Member #208
http://www.firebirdsql.org
ASE
Kıdemli Üye
Mesajlar: 518
Kayıt: 28 Ağu 2003 03:17
Konum: samsun
İletişim:

Mesaj gönderen ASE »

Ellerine sağlık.
Sağol @Terminator
Allah'ım!...
Yol boyunca bırakma elimi...
Düşerim sonra...


ASE YAZILIM
oquz

örnek yazdım

Mesaj gönderen oquz »

bunu yapmak oldukça basit.

bunun için mysqlde bir örnek yaptım aşağıda;

tablo:
CREATE TABLE `oquz` (
`kod` char(10) NOT NULL default '',
PRIMARY KEY (`kod`)
) ENGINE=InnoDB DEFAULT CHARSET=latin5;

veriler:
INSERT INTO `oquz` VALUES ('1');
INSERT INTO `oquz` VALUES ('a1');
INSERT INTO `oquz` VALUES ('11');
INSERT INTO `oquz` VALUES ('12');
INSERT INTO `oquz` VALUES ('c3');
INSERT INTO `oquz` VALUES ('2');
INSERT INTO `oquz` VALUES ('a4');
INSERT INTO `oquz` VALUES ('b');
INSERT INTO `oquz` VALUES ('b5');
INSERT INTO `oquz` VALUES ('c');

sql:
select kod from oquz
order by IF(trim(kod)+0=0,rpad(trim(kod),10,' '),lpad(trim(kod),10,'0'))

sql sonucu:
1
2
11
12
a1
a4
b
b5
c
c3


kolay gelsin.

ha accesste nasıl yapılacak derseniz o benim problemim değil.
nedimtrc
Üye
Mesajlar: 23
Kayıt: 02 Nis 2007 09:31

firebird'de sıralama

Mesaj gönderen nedimtrc »

peki oğuz arkadaşımızın mysql ile çok basit şekilde yaptığı bu sıralamayı firebird ile en kısa biçimde nasıl yapılabileceğini bilen arkadaşların bir örnek vermesini rica ediyorum eminim ki firebird ile bu işlemi yapmak mümkündür.
volkancesur
Üye
Mesajlar: 53
Kayıt: 01 Nis 2007 09:47
Konum: DENİZLİ

.

Mesaj gönderen volkancesur »

teşekkürler
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

String Alanı Sayısal gibi sıralama

Mesaj gönderen akdatilla »

Tarih: 13 Eyl 2004 10:52 Mesaj konusu: string alanı saysal gibi sıralama

--------------------------------------------------------------------------------

Elimde string bir alan var burada öğrenci numaralrını tutuyorum.Sql ile nasıl sıralama yaptırabilirim.Yani alanı sayı gibi göstererek.VT Access
kayıltar şöyle
misalen
1
5
10
2
a1
e1
c1
sql ile sıralama yaptırdığımda sıralama şöyle olmalı
1
2
5
10
a1
c1
e1
------------------------------------------------------------------
Yukarıdaki tabloda gördüğüm kadarıyla hex tabanlı sayılar kullanılmış. Eğer cevirerek sıralamak istediğin alan sadece hex verilerden oluşuyorsa. Aşağıdaki sistemi kullanabilirsin bence.
Örnek Tablo yapısı:
CREATE TABLE TESTHEX
(
IDFIELD INT,
HEXFORMATLISTRALAN VARCHAR(50),
PRIMARY KEY (IDFILED)
)

MSAcces için Tam Sayıya dönüştürerek Sıralama örnek SQL komutu:
SELECT (CINT('&h'+HEXFORMATLISTRALAN)) as INTFILED,HEXFORMATLISTRALAN FROM TESTHEX ORDER BY 1
Cevapla