like ama çoklu seçenek nasıl olur?

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ı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

like ama çoklu seçenek nasıl olur?

Mesaj gönderen nitro »

s.a.

arama yaptım ama ya arama yeteneğim az ki bulamadım ya da benzer bir konu konuşulmamış ki bulamadım.
sorguda like kullanıcam ama birden fazla karşılaştırma yapsın.
mesela

Kod: Tümünü seç


select * from tablo where bilgi like between ('%01.02.2006%') and ('%30.03.2006%') 
burdaki amacım kullanıcının not yazdığı alandan veri çekmek. mesela adam fielde yazıyor ki. 'bu para 12.02.2006' da tahsil edildi.'
benim sorgum ben tarih aralığı verince bu kayda ulaşmalı.
yardımlarınız için şimdiden teşekkürler.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

a.s.

and kullanarak istediğin kadar şart ekleyebilirsin. Ancak like çok yavaş çalışır ve çoğu zamanda indeksi kullanamayabilir. Eğer ödeme tarihi gibi alanları bir tabloya kaydedip sorgularsan daha iyi olur. Yapını bir gözden geçir.

Kod: Tümünü seç

select *
from tablo
where alan1 like 'ali%'
and alan1 like 'veli%'
and alan2 like '%4950%'
Bu tarz bir sorgu ile birçok şart ekleyebilirsin. Ama amacın 1'i ile 30'u arasında ödeme kayıtlarını bana döksün gibi birşeyse bunu like ile çok zor yaparsın. Kulağı bacak arasından geçirip tutman lazım. Bu alanı date veya datetime yapıp sorgulaman daha iyi olur.

Kolay gelsin.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Ek olarak like ile '01.01.2006' şeklinde gireceğin tarih değerini FireBird bulamayacaktır, sql tarih formatı kullanman geremekte.

Kolay gele..
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

peki içinde tarih ibaresi olan varchar field'den tarihi çeken bi sorgu yapamazmıyım. mesela

Kod: Tümünü seç

select * from tablo where (fieldde ##.##.#### gibi bir ibare varsa o) as tarih between '01.02.2005' and '01.04.2006'
yani burada bana lazım olan şey fielddeki ##.##.#### olan kısmı çekecek bir kod.
ylmz
Üye
Mesajlar: 110
Kayıt: 18 Mar 2005 02:32
Konum: Antalya

Mesaj gönderen ylmz »

merhaba,

select * from tablo
where
field like '%__.__.____%' or field like '%_._.____%' or .....

% karakteri birden fazla karakterle eşleşir
_ karakteri ise sadece tek bir karakterle eşleşir.

gibi bir yöntemle sql yazılabilir.Ama böyle bir yöntemin amatörce olacağını düşünüyorum.ayrıca like taki kombinasyonlar çok fazla olabilir(buna bağlı olarak sorgunun çalışma süresi de artacak).bence yeni bir field tanımlamanız daha iyi bir çözüm olacaktır.

iyi çalışmalar.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Diğer arkadaşlarımızın söylediği gibi tarihi ayrı bir alan olarak kullanmanız gerekir. Yok eğer "benim böyle bir alan oluşturmaya imkanım yok daha önce böyle girilmiş ve benim onları almam gerekiyor " diyorsanız. Aşağıdaki iskeleti biraz daha geliştirerek kendinize uygun hale getirebilirsiniz.

!!! Bu programcık __.__._____ şeklinde girilenleri arıyor. Yani ilk noktayı buluyor. Sonra bulduğu konumdan 2 konum sonrasına bakıyor o da '.' ise bulmuş oluyor. Ama eğer
bu kayıt.25.10.2006 tarihinde tahsil edildi.
şeklinde yazılmışsa hatalı olacaktır. O yüzden biraz da geliştirmeniz lazım diyorum. Ayrıca 29.02.2006 şeklinde bir tarih yazmışsa da 2006 da 29 olmadığından hata verecektir. Bu tür kontrolleri yapmanız lazım.

!!!! Bu programcıkta rfunc udf leri kullanılmıştır. Örneğin strpos ve substr yi kullanmak için onları yüklemiş olmanız lazım.

Programcık dökümü aşağıdadır.

Kod: Tümünü seç

CREATE PROCEDURE TARIH_AL (
    BASLANGIC DATE,
    BITIS DATE)
RETURNS (
    ADSOY VARCHAR(10),
    DOGTAR DATE,
    ACIKL VARCHAR(50),
    ACIKLAMA_TAR DATE)
AS
DECLARE VARIABLE CIKIS CHAR(1);
DECLARE VARIABLE KONUM INTEGER;
DECLARE VARIABLE SONUC VARCHAR(10);
begin
  for
  select adi_soyadi,dogum_tar,aciklama
   from dog_tarihi where aciklama like '%__.__.____%'
   into :adsoy, :dogtar,:acikl
             do begin

         CIKIS='H'  ;
      while (CIKIS='H')

         do begin

              KONUM=strpos('.',:acikl);
                if (SUBSTR(:acikl,KONUM,1)='.') then

                sonuc=substr(:acikl , KONUM-2,10);

                CIKIS='E' ;
                aciklama_tar=cast(sonuc as date);
                 if (aciklama_tar>=baslangic and aciklama_tar<=bitis) then


                   suspend;
               end


               end

end




Programcığı denemek için aşağıdaki tablo oluşturulmuştur.

Kod: Tümünü seç

CREATE TABLE DOG_TARIHI (
    KNO         INTEGER,
    ADI_SOYADI  VARCHAR(50),
    DOGUM_TAR   DATE,
    ACIKLAMA    VARCHAR(50) COLLATE PXW_TURK
);

Tabloya aşağıdaki örnek veriler girilmiştir.

Kod: Tümünü seç

INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (1, 'KADRI ', '1991-02-14', 'bu para 12.02.2006 da tahsil edildi. ');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (2, 'AHMET', '1991-02-15', 'bu para 14.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (3, 'MEHMET', '1991-03-01', 'bu para 18.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (4, 'SAIT', '1991-03-08', 'bu para 23.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (5, 'SELAMI', '1991-03-16', 'bu para 25.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (6, 'SADULLAH', '1991-04-17', 'bu para 12.02.2007 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (7, 'SADIK', '1991-05-25', 'bu para 15.03.2007 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (8, 'KERİM', '1991-05-23', 'bu para 19.02.2006 da tahsil edildi.');
INSERT INTO DOG_TARIHI (KNO, ADI_SOYADI, DOGUM_TAR, ACIKLAMA) VALUES (9, 'NURULLAH', '1991-05-21', 'bu para 11.02.2006 da tahsil edildi.');

COMMIT WORK;
Bu şekilde hazırlandıktan sonra

Kod: Tümünü seç

select * from tarih_al('01.02.2006','28.02.2006')
gibi komut girilerek sonuç alınabilir. Ben ibexpertte denedim. Normal çıkıyordu.

Birinci tarih başlangıç, ikinci tarih bitiş tarihi oluyor.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

teşekkürler arkadaşlar,
ayrıca sayın ofenX'in sunduğu çözüm bence burumda düşünülebilecek en iyi algoritma. elbette sadece tarihi tutan bir field oluşturulabilir ve bunu yapmak en akıllıcası ama bu sorun kafama takıldı. Bence çözüm de budur.
saygılarımla
Cevapla