Tablodaki Alanları Birleştirmek

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
barutali
Üye
Mesajlar: 297
Kayıt: 02 Tem 2007 02:30

Tablodaki Alanları Birleştirmek

Mesaj gönderen barutali »

Öncelikle konuyu okuyan herkese merhaba;
Aslında sorunuma tam olarak karşılık bir başlık bulamadığım için sorunumun içinde kalan bir kısmı kullanmak zorunda kaldım..

Kod: Tümünü seç

  dbo.TBLCARIADRES.ID,
  dbo.TBLCARIADRES.MUSID,
  dbo.TBLCARIADRES.ADSEMT,
  dbo.TBLCARIADRES.ADMAHALLE,
  dbo.TBLCARIADRES.ADBULVAR,
  dbo.TBLCARIADRES.ADSOKAK,
  dbo.TBLCARIADRES.ADCADDE,
  dbo.TBLCARIADRES.ADSITE,
  dbo.TBLCARIADRES.ADKAPINO,
  dbo.TBLCARIADRES.ADKAT,
  dbo.TBLCARIADRES.ADDAIRE,
  dbo.TBLCARIADRES.ADAPARTMAN,
  dbo.TBLCARIADRES.ADILCE,
  dbo.TBLCARIADRES.ADIL
tablodaki alanların yukarıdaki gibi .. Bu alanları birleştirirken sorun yok ALAN1+ SPACE(1) + ALAN2 gibi birşleştirip tek kolon olarak gösterebiliyorum .. Ama sorun şurda başlıyor..
Örnek olarak :
ADSOKAK : 100
ADKAT : BOŞ OLSUN
ADAPARTMAN : Cumhuriyet olsun
ben bunları ..
100 sokak Cumhuriyet Apartmanı olarak yazdırmak istiyorum ..

Kod: Tümünü seç

 ADSOKAK + space(1)+ 'Sokak'+ space(1)+ 'Kat : ' + space(1)+ ADKAT + space(1) + ADAPARTMAN + Space(1)+ 'Apartmanı' 
gibi yazınca alanların hepsi dolu ise sorunsuz çalışıyor .. Ama örnekte dikkat ettiyseniz ADKAT boş .. Ve bu yüzden SQL cümlem çakıyor ... Hiç bir değer döndürmüyor..
Nerde yanlış yapıyorum acaba ? yada alternatif bir fikri olan yada tecrübeli arkadaşların fikirlerine sonuna dek açığım ...

Teşekkürler ...
İyi Çalışmalar ..
amatör küme programcı :D
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Tablodaki Alanları Birleştirmek

Mesaj gönderen aslangeri »

s.a.
boş olan alanlar(*) için select ifadende kontrol koyarsan muhtemelen düzelir.

Kod: Tümünü seç

ADSOKAK + space(1)+ 'Sokak'+ space(1)+ 'Kat : ' + space(1)+ coalesce(ADKAT,'') + space(1) + ADAPARTMAN + Space(1)+ 'Apartmanı'
(*)boş derken null olduğunu anlıyorum. yoksa boş olsa ('') toplama ifadesinde sorun olmaması gerekir.

onun haricinde eğer kat boş ise hiçbirşey göstermesin istiyorsan biraz karışık bir case bloğu ile yapılabilir.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Tablodaki Alanları Birleştirmek

Mesaj gönderen conari »

Kod: Tümünü seç

CASE WHEN ADSOKAK<>'' THEN ADSOKAK +' Sokak' else '' end + 
CASE WHEN ADKAT<>'' THEN ' Kat:'+ADKAT else '' end
..........
bu zor olur diyorsanız fieldlerı delphi de ifthen() ile kontrol edip birleştirebilirsiniz.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Tablodaki Alanları Birleştirmek

Mesaj gönderen sabanakman »

İşin içine NULL değer girince sonuç ta null çıkmaktadır. O yüzden null değeri isnull veya coalesce ile null olmayan boş değermiş gibi ele almak gerekmektedir.

Kod: Tümünü seç

isNull(ADSOKAK,'') + space(1)+ 'Sokak'+ space(1)+ 'Kat : ' + space(1)+ isNull(ADKAT,'') + space(1) + isNull(ADAPARTMAN + Space(1)+ 'Apartmanı','')
SQL sorgularda NULL ile işleme giren hesaplamaların sonucu da null çıkacağı için bu fonksiyonlardan birisi kullanılır veya case - when ile kontrole alınır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Tablodaki Alanları Birleştirmek

Mesaj gönderen conari »

hoca, isnull tamamda
şimdi arkadaş birleştirmiş.

Kod: Tümünü seç

'Kat : '+ ISNULL(ADKAT,'')
field ADKAT boş ise bu adreste

"Kat:" olarak eklenecek arkadaş bunun eklenmemesini istiyor sanıyorum.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Tablodaki Alanları Birleştirmek

Mesaj gönderen sabanakman »

Verdiğim kod mantıksız ve baştan savma olabilir ama mantık üzerine yorum getirerek çözüm üretilebilir. Mesela 'Kat : '+ ISNULL(ADKAT,'') kodu yerine ISNULL('Kat : '+ ADKAT,'') şeklinde yazılabilir. Hatta işi bir adım daha ileri götürürsek örnek ISNULL('Kat : '+ case when ltrim(ADKAT)<>'' then ADKAT end,'') şeklini alacaktır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
barutali
Üye
Mesajlar: 297
Kayıt: 02 Tem 2007 02:30

Re: Tablodaki Alanları Birleştirmek

Mesaj gönderen barutali »

Sevgili hocalarım cevaplarınız için çok teşekkür ederim .. Aşağıdaki Gibi düzenleyince tam istediğim şey oldu ..
Fakat bi sorun var / yada yok :) Performansı etkilermi ? bir carinin en az 2 tane adres bilgisi olduğunu varsayarsak 2000 cari de 4000 kayıt eder .. SQL Server 05 Exp. kullanıyorum .. Verdiğim sayılar minimum değerler.. Çünkü programı yazdığım sektör de en önemli şey adresler :)

Kod: Tümünü seç

SELECT 
  dbo.TBLCARIADRES.MUSID,
  dbo.TBLCARIADRES.TELEFONNO,
  dbo.TBLCARIADRES.TIPI,
  LTRIM
 (ISNULL(case when ltrim(ADMAHALLE)        <> ' ' then ADMAHALLE end, ' ') 
+ ISNULL(' ' + case when ltrim(ADBULVAR)   <> ' ' then ADBULVAR+ ' Bulvarı' end, ' ')
+ ISNULL(' ' + case when ltrim(ADCADDE)    <> ' ' then ADCADDE+' Caddesi' end, ' ') 
+ ISNULL(' ' + case when ltrim(ADSOKAK)    <> ' ' then 'Sk.No: '+ADSOKAK end, ' ') 
+ ISNULL(' ' + case when ltrim(ADSITE)     <> ' ' then ADSITE+' Sitesi' end, ' ') 
+ ISNULL(' ' + case when ltrim(ADAPARTMAN) <> ' ' then ADAPARTMAN+' Apt./İş Mrk.' end, ' ') 
+ ISNULL(' ' + case when ltrim(ADKAPINO)   <> ' ' then 'Kapı No: '+ADKAPINO end, ' ') 
+ ISNULL(' ' + case when ltrim(ADKAT)      <> ' ' then 'Kat: ' +ADKAT end, ' ')
+ ISNULL(' ' + case when ltrim(ADDAIRE)    <> ' ' then 'Dr: ' +ADDAIRE end, ' ') 
+ ISNULL(' ' + case when ltrim(ADSEMT)     <> ' ' then ADSEMT end, ' ') 
+ ISNULL(' ' + case when ltrim(ADILCE)     <> ' ' then ADILCE+ ' / ' end, ' ') 
+ ISNULL(' ' + case when ltrim(ADIL)       <> ' ' then ADIL end, ' ')) 
AS ADRES
FROM
  dbo.TBLCARIADRES
amatör küme programcı :D
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Tablodaki Alanları Birleştirmek

Mesaj gönderen conari »

2 bin 10 bin bir şey değil.
2 sn yerine 4 sn de gelir. indexler ve makinanın kuvveti önemli.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Cevapla