Delphi Can
Where Alanını If İçerisinde Kullanmak - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Veri Tabanı (https://www.delphican.com/forumdisplay.php?fid=4)
+--- Forum: Diğer Veri Tabanları (https://www.delphican.com/forumdisplay.php?fid=18)
+--- Konu Başlığı: Where Alanını If İçerisinde Kullanmak (/showthread.php?tid=2959)

Sayfalar: 1 2 3


Where Alanını If İçerisinde Kullanmak - TescilsizUzman - 28-11-2018

Merhaba,
PostgreSQL veri tabanı üzerinde bir fonksiyon içerisinde gelen parametre değerine göre Where ifadesini şekillendirmek istiyorum. 
Örneğin, Parametre 1 ise Where A=5
Parametre 2 ise Where B=8
Parametre 3 ise Where C=10 gibi
Şimdilik daha iyi bir çözüm bulana kadar tüm SQL'i If deyimi arasına alıyorum. 
Bu konuda çözüm önerilerinizi bekliyorum.


Where Alanını If İçerisinde Kullanmak - mrmarman - 28-11-2018

where kısmında CASE WHEN ile kontrol altına alınabilir diye düşündüm ama yanlış da anlamış olabilirim. 


Kod:
Select * FROM tabloadi 
where case when $1 = 1 THEN a =$2 
WHEN $1 =2 THEN b = $2 END
fonksiyon parametreleri param1 ve param2 için
$1 param1 yani 1,2 gibi $2 ise param2 yani karşılaştıracağınız değer olsun. 
gibi dener misiniz.


Where Alanını If İçerisinde Kullanmak - 3ddark - 28-11-2018

CREATE TABLE public.a1
(
    id integer NOT NULL DEFAULT nextval('a1_id_seq'::regclass),
    ad character varying COLLATE pg_catalog."default",
    soyad character varying COLLATE pg_catalog."default",
    deger character varying COLLATE pg_catalog."default"
)

1 "ayşe" "fatma" "1"
2 "ferhat" "3ddark" "2"
3 "software" "thunder" "3"


-- FUNCTION: public.aa(text)

-- DROP FUNCTION public.aa(text);

CREATE OR REPLACE FUNCTION public.aa(
filtre text)
    RETURNS text
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
AS $BODY$
DECLARE
dmp text;
_sql text;
BEGIN

IF filtre = '1' THEN
_sql := ' AND deger = ''1'' ';
ELSIF filtre = '2' THEN
_sql := ' AND ad = ''ferhat'' ';
ELSIF filtre = '3' THEN
_sql := ' AND soyad = ''thunder'' ';
END IF;

EXECUTE 'SELECT * FROM a1 WHERE 1=1 ' || _sql;

RETURN _sql;
END;
$BODY$;

ALTER FUNCTION public.aa(text)
    OWNER TO postgres;


SELECT public.aa('1')
" AND deger = '1' "

SELECT public.aa('2')
" AND ad = 'ferhat' "

SELECT public.aa('3')
" AND soyad = 'thunder' "

Birde buradaki format fonksiyonu var oda bayağı işe yarıyor. Bir kenarda bulunsun.
https://www.postgresql.org/docs/9.3/functions-string.html#FUNCTIONS-STRING-FORMAT


Cvp: Where Alanını If İçerisinde Kullanmak - mustafaozpinar - 29-11-2018

(28-11-2018, Saat: 21:38)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Merhaba,
PostgreSQL veri tabanı üzerinde bir fonksiyon içerisinde gelen parametre değerine göre Where ifadesini şekillendirmek istiyorum. 
Örneğin, Parametre 1 ise Where A=5
Parametre 2 ise Where B=8
Parametre 3 ise Where C=10 gibi
Şimdilik daha iyi bir çözüm bulana kadar tüm SQL'i If deyimi arasına alıyorum. 
Bu konuda çözüm önerilerinizi bekliyorum.
Eğer parametreler belirliyse şu şekilde bir Where kullanılabilir.

select * from Table1 where (Parametre=1 and A=5) or (Parametre=2 and B=8) or (Parametre=3 and C=10);


Cvp: Where Alanını If İçerisinde Kullanmak - Abdullah ILGAZ - 29-11-2018

CurrentParameter (Gelen Parametre Tipi)
QueryValue (Aranacak Veri Değeri)
query (Örnek SQL.Text + peşinen where anahtar sözcüğü)
where (Koşul için  case of sonucu)


var
query:string;
where:string;
begin

query := 'select * from MyTable' + ' where ';

case CurrentParameter of
1: where := 'B = ' + QuotedStr(QueryValue);
2: where := 'C = ' + QuotedStr(QueryValue);
3: where := 'D = ' + QuotedStr(QueryValue);

end;

Result := query+where;

end;

Bu tarz bir işlem çok mu yorar? Ben genelde bu tarz durumlarda RadioButton'a Tag ataması yapıp gelen RadioButton'un Tag özelliğine göre Kodu, Adı vs. filtre alanını böyle belirliyorum.


Where Alanını If İçerisinde Kullanmak - ssahinoglu - 29-11-2018

Koşul sayısına da bağlı.

5 farklı koşullu tek sorgu kullanmaktansa, tek koşullu 5 farklı sorgudan birini çalıştırmak daha performanslı olsa gerektir.

Yani sql'in dışında verilebilen IF daha güçlüdür. Veritabanı sistemlerinde deterministik durum denir genelde.


Cvp: Where Alanını If İçerisinde Kullanmak - TescilsizUzman - 29-11-2018

Merhaba,
Değerli vakitlerini ayırarak, cevap yazan tüm DelphiCan'lara teşekkür ederim.
Fonksiyon parametreleri aşağıdaki gibi olacak.
"sp_gorevlerim"("sorguId" int2, "GonderenNo" int8, "PersonelNo" int8)
Fonksiyonun SQL ifadesini de aşağıdaki gibi bir yapı ile kurmaya çalışıyorum.
SELECT ad, soyad FROM ogrenci
IF sorguId=1 
 //Where koşulu olmadan tüm kayıtlar gelecek
ELSE IF sorguId=2
 Where (GonderenNo=123)
ELSE IF sorguId=3
 Where (PersonelNo=752)
Bu durumda @3ddark 'ın vermiş olduğu örnek istediğim yapıya oldukça yakın.


Cvp: Where Alanını If İçerisinde Kullanmak - sadettinpolat - 29-11-2018

Alıntı:WHERE (AD  = : PRM_AD or : PRM_AD = -1)
             AND   (SOYAD  = : PRM_SOYAD or : PRM_SOYAD = -1
             AND   (IL  = : PRM_IL or : PRM_IL = -1)

ben bu şekilde yapıyorum genelde.

-1 verdiğim parametre bypass olmuş oluyor.


Cvp: Where Alanını If İçerisinde Kullanmak - Tuğrul HELVACI - 29-11-2018

CREATE PROCEDURE [dbo].[sp_Tablonuz_BROWSE]
    @Parametre1            INT            = NULL,
    @Parametre2            VARCHAR(15)    = NULL,
    @Parametre3            INT            = NULL,
    @Parametre4            INT            = NULL
AS
    SELECT
        TA.Alan1,
        TA.Alan2,
        TA.Alan3,
        TA.Alan4,
        TA.Alan5
    FROM Tablonuz TA
    WHERE
        TA.KriterAlani1 = ISNULL(@Parametre1, TA.KriterAlani1) AND
        TA.KriterAlani2 = ISNULL(@Parametre2, TA.KriterAlani2) AND
        TA.KriterAlani3 = ISNULL(@Parametre3, TA.KriterAlani3) AND
        TA.KriterAlani4 = ISNULL(@Parametre4, TA.KriterAlani4)

Ben genelde bu şekilde kullanıyorum. Bu tarz bir kullanımda tüm alanları NULL geçersem (varsayılan o şekilde) tablodaki tüm kayıtlar gelir. Hangi alanı kritere dahil etmek istiyor isem sadece o alanı NULL harici bir değer ile doldurmam yeterli olacaktır.

Not: Örnek Microsoft SQL Server'a göre verilmiştir.


Cvp: Where Alanını If İçerisinde Kullanmak - TescilsizUzman - 29-11-2018

(29-11-2018, Saat: 08:43)sadettinpolat Adlı Kullanıcıdan Alıntı:
WHERE (AD  = : PRM_AD or : PRM_AD = -1) 
             AND   (SOYAD  = : PRM_SOYAD or : PRM_SOYAD = -1) 
             AND   (IL  = : PRM_IL or : PRM_IL = -1)
ben bu şekilde yapıyorum genelde.

-1 verdiğim parametre bypass olmuş oluyor.

Farklı bir yaklaşım olmuş, teşekkür ederim. 
Where ifadesinin dinamik oluşturulabileceği bir SQL yapısı daha çok işime yarayacak.
@3ddark, belirttiğiniz şekilde fonksiyonu yeniden revize ettim. Fakat aşağıdaki hatayı alıyorum. 

ERROR:  operator does not exist: integer = text
LINE 19:     1 = 1  || sqlSart
              ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

İlgili satırları aşağıdaki gibi text'e dönüştürdüğümde fonksiyon çalışıyor. Fakat sonuç dönmüyor.
 
WHERE '1' = '1'  || sqlSart 

Fonksiyon içeriği aşağıdaki gibidir.
CREATE 
OR REPLACE FUNCTION "gorev_takip"."sp_gorevlerim2" ( "sorguId" int2, "GonderenNo" int8, "PersonelNo" int8 ) 
RETURNS TABLE (
   "Gorevid" int8,
   "GorevTuru" VARCHAR,
   "Ack" VARCHAR,
   "Tarih" DATE,
   "Saat" TIME 
) AS $BODY$ 
DECLARE
   sqlSart TEXT;
BEGIN
IF
  "sorguId" = 1 THEN
    sqlSart := ' ';
ELSIF "sorguId" = 2 THEN
   sqlSart := ' (gr."GONDEREN_ID" = "GonderenNo")';
ELSIF "sorguId" = 3 THEN
   sqlSart := ' (gper."PERSONEL_ID" = "PersonelNo")';
END IF;

RETURN query 
SELECT
  gr."ID",
  gt."AD" AS "GOREV_TURU",
  gr."ACK",
  gr."TARIH",
  gr."SAAT" 
FROM
   gorev_takip."GOREV" AS gr
   INNER JOIN gorev_takip."KOD_GOREV_TURU" AS gt ON gr."GOREV_TUR_ID" = gt."ID"
   LEFT JOIN gorev_takip."EKIP" AS ekp ON gr."EKIP_ID" = ekp."ID"
   INNER JOIN gorev_takip."KOD_GOREV_DURUM" AS gd ON gr."SON_DURUM_ID" = gd."ID"
   INNER JOIN gorev_takip."PERSONEL" AS per ON gr."GONDEREN_ID" = per."ID" 
WHERE
   1 = 1 || sqlSart 
ORDER BY
  gr."TARIH" DESC,
  gr."SAAT" DESC;
END;
$BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000