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) |
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 $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,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) 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. 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 |