Új hozzászólás Aktív témák
-
-
-
-
-
-
a kérdés konkrétan postgresql és jáva, de szerintem általánosítható.
text mezőben akarok sql kereséseket tárolni. hogy kell escape-lni, van-e rá valami szabvány eljárás vagy kész függvény?Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz Peter Kiss #1723 üzenetére
nekem is ez volt a kezdő ötlet, de itt szokott lenni jobb is...
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz Jester01 #1725 üzenetére
nem használhatok paraméteres sql-t, mert semmilyen előzetes infóm nincs arról, hogy milyen selectet akarnak később... azt akarom megoldani, hogy egyszer megfaragom a programot jávában, utána pedig bármilyen hasfájásuk van, csak betolok egy rekordot egy táblába és le tudják tölteni a keresés eredményét.
ezt, hogy előre semmit nem tudok a lekérdezésről, nemigen lehet paraméterezni...
a bármi más escapelését eddig kerülőúton oldottam meg...
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
válasz Jester01 #1729 üzenetére
adminisztrációs rendszer. jávában, webes felülettel. időnként beesik a főnök agyába, hogy erről meg arról listát akar. én meg nem akarok folyton gép előtt dekkolni, hogy megcsináljam neki a listát.
ezért azt találtam ki, hogy írok egy programrészt, ami egy tetszőleges select eredményét xls-be konvertálva letölthetővé teszi a webes felületről. egy tábla, abban egy rekord egy lekérdezés, egyik mező név, másik mező egy text, amiben a select van. ha a főnöknek kiújul a könyökfájása, akkor összematekolom az sql kifejezést és beletöltöm az adatbázis táblájába távolról.na innen indul a kérdés, hogy milyen formátumban töltsem bele. utána ő a webes felületén kiválasztja egy dropdown menüből, hogy melyik listát akarja, klikkel és letöltődik a lista.
egy átlagos selectben nyilván lesz aposztróf, stb. amit csak úgy nem lehet inzertálni a táblába, meg szelektálni belőle. ehhez kellene a net nagy iq-ja, hogy hogyan kódoljam a selectet, amit utána jávában egyszerűen vissza lehet konvertálni sql stringgé, amit utána le tudod futtatni.
de nekem nem kell webes felület, hogy beletöltsem az adatbázisba, egyrészt mer minek, másrészt nem baj az, ha ők nem tudnak mindenféle bravúros dolgot könnyen beletölteni, amivel utána kigyalulnak mindent.
a base64, mint eddig elhangzott ötlet, egészen jónak tűnik, csak megvárom, tud-e valaki jobbat (ezt a mondatot erősen értsd magadra )
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz Jester01 #1731 üzenetére
egy insert into tabla (sql_command) values ('select * from customer where name like 'kovács%';'); utasítás szerintem nem fog lefutni.
az még nekem is egyértelmű, hogy itt a belső aposztrófokat escapelni kell. és még mit?
de mivel az itteni hozzászólások alapján többen is jobban konyítanak ehhez, mint én, hasznosnak láttam feltenni a kérdést.Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
select * from customer where name like "kovcs%";
ERROR: column "kovcs%" does not exist
LINE 1: select * from customer where name like "kovcs%";szerk: közben rájöttem, dupla aposztrófra gondolhattál, nem idézőjelre.
[ Szerkesztve ]
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
-
válasz dellfanboy #1798 üzenetére
az milyen jó lesz, ha rájönnek, hogy az ő biztonsági előírásaik ellenére meg tudtad oldani a feladatot, és leadtad, ahelyett, hogy szólták volna, hogy akadályozva vagy.
na akkor fognak fejek hullani, sorozatban, a tied csak az első lesz, de nem az egyetlen.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
kellene gyors segítség: postgresql-ben van valami eval vagy exec szerű függvény? valami ilyen kellene, hogy:
select * from eval (select sql_command from table where id=1);
egy halom grafikont kellene legyártanom, és utálnám, ha kézzel kellene. tia.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz Speeedfire #1822 üzenetére
én úgy látom, hogy itt a from query-ben megadott select eredményét hozza ki, nem pedig a megadott select lefuttatásával kapott eredményt.
de lehet, hogy elgépeltem valamit, nem tudom.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz Speeedfire #1824 üzenetére
execute vagy pl/pgsql scriptben van, vagy prepared statementben. Ez utóbbi esetben nem így kell meghívni, hanem a nevével és a paramétereivel.
a pl/pgsql scripttel azért nem bírtam még zöldágra vergődni, mert nem lehet tudni előre, hogy milyen formátumban adja vissza a táblát az exec, de azt előre bele kellene drótozni a scriptbe. pech.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
válasz martonx #1829 üzenetére
Három dolgot nem értek a válaszodban:
- függvényt kerestem volna eredetileg, ez meg tárolt procedúrában egy vezérlési szerkezet
- attól, hogy for-ral dolgozom fel a query eredményét, hogyan fog változni a tárolt procedúra által visszaadott adatok típusa?
- miért kellene for-t használnom arra, amire van beépített kész utasítás?tartok tőle, nem ugyanazt értettük a kérdésem alatt.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz martonx #1831 üzenetére
a probléma a következő: van egy halom mérési eredményem. ebből csinálni kell egy halom grafikont. a grafikon legyártása gyakorlatilag ugyanolyan lépésekből áll, kivéve, hogy az adatsort, amiből lesz, más-más query-k adják. ezért gondoltam arra, hogy a különbözőséget jelentő queryket belerakom egy táblába, a többihez írok egy darab scriptet, aminek egy paramétere, hogy hanyadik query-s grafikont csinálja meg és azt futtatom.
ehhez kellene egy olyan, amit más programozási nyelvekben evalnak szoktak hívni, hogy összerakom valahogy egy stringbe a queryt és azt ugyanúgy feldolgoztatom, mintha simán beírt query lenne.
"Úgy értettem, hogy egy query eredményeként kigenerálsz egy rakás SQL query-t, és ezeket szeretnéd egymás után futtatni programozottan.": mindig egy query lesz az eredmény, azt kell futtatni.
Erre elvileg (postgrestől elvonatkoztatva) két módszer létezhet:
- van készen eval függvény
- tárolt eljárást kell rá írni.A postgresben nincs eval függvény, meg más sem, amire hunyorítva nézve eval függvény lehetne, ezért ez az út járhatatlan.
A postgresnek a tárolt eljárási környezetében van olyan, hogy visszatérési eredményként egy query által generált táblát adok vissza, de ezzel az a probléma, hogy a tárolt eljárás definíciós részében meg kell adni a tábla formátumát, hogy milyen rekordtípust fog visszaadni, az pedig nem egyforma. Így nem tudom a tárolt eljárásban a return query exec-et használni.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz martonx #1833 üzenetére
de nem akarom a query recordjain végiglépkedni, mert egy query-m van.
van egy táblám, van benne n darab query. ezekből a querykből mindig pontosan egyre van szükségem, sem többre, sem kevesebbre. pontosan egy elemű for ciklust futtatni nem látszik hasznosnak. majd egy másik, későbbi időpontban egy másik queryre van szükségem, de akkor is csak pontosan egyre.(#1834) Ispy
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
"a kliens (pl. egy shell script) elkeri a futtatando query-ket es szepen beadagolja": ez egyre inkább igaznak tűnik, csak eddig volt már rá több példa is, hogy egy-két okos embernek volt jobb megoldása, mint amit én elsőre találtam, ebben bíztam most is.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
számlafejbe végösszeget... a pokolba vezető út is jószándékkal van kikövezve
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
ilyenkor jön az, hogy hagyod a pokolba a szép, elegáns, meg minden joinokat, és megcsinálod a régi szintaxissal:
select versenyzo.nev, kategoriak.megnevezes from versenyzo,kategoriak,nevezett where
nevezett.versenyzoid=versenyzo.id and nevezett.kategoriaid=kategoriak.id;Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz csabyka666 #2047 üzenetére
ahhoz, hogy lásd ennek a célját, érdemes először alaposan elolvasni a Chomsky-féle normálformákat.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
debian, postgresql
van-e arra mód, hogy egy select eredményéből újabb aggregált eredményt csináljak anélkül, hogy letenném egy ideiglenes táblába?
részletek:
van egy tábla, benne szerződések, és egy ügyfélazonosító. egy ügyfélnek tetszőleges számú szerződése lehet.
azt szeretném tudni, hogy hány ügyfél van, akinek 1,2,3,... darab szerződése van.
addig oké, hogy egy select ugyfelid,count(*) as darab from szerzodes megmondja, hogy egy ügyfélnek hány szerződése van, de erre kellene még egy aggregálás a darab szerint.tia
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
ezt az ötletet a Chomsky féle normálformákról és az adatbázis normalizálásról szóló vizsgán ne vezessétek elő, mert megbuktatnak
átfogalmazva: az ötlet rossz, nem denormalizálunk adatbázist.
a helyes megoldás, hogy felveszel egy kulcstáblát, és abba belerakod a szövegeket, azonosítóval.
amikor az adatbáziskezelés elveiről van szó, akkor a disk io nem számít szerintem.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
ha egy táblában van ötezer sor, aminek egy mezőjében 10 stringből található 1, akkor az denormalizált.
a string rendszerű tárolással meg az a baj, hogy könnyű elgépelni, mikor hivatkozol rá, esetleg van benne ékezet is, amitől fejreállnak a kliensek, meg hasonlók. persze mondhatod erre, hogy nem, de abból az lesz, hogy most nem, és később?
az egész sql bagázs arról szól, hogy a hatékonyságot feláldozzuk más erények érdekében. merthogy az sql masszívan nem hatékony akár a hálós adatbáziskezelőket nézed, akár a nosql-t, vagy ilyeneket.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
ha csinálsz egy személyzeti nyilvántartást, a település nevét ott se rakod be karakteresen, hanem csinálsz hozzá egy szótár táblát és integer azonosítóval "linkeled".
pontosan ugyanezért denormalizálás, amiről beszélsz.azok után pedig, hogy azt állítottam, az sql-ben a teljesítményt feláldozzuk más célok elérése érdekében, ez a link mennyiben releváns?
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
"Ez úgy hangzott, mintha az SQL használatával nagyságrendekkel rosszabb teljesítményt érnénk el": ez valószínűleg azért hangzott úgy, mert igaz, feltéve, hogy nem az eredeti szövegkörnyezetéből kiszakítva értelmezed a mondatot. az eredeti szövegkörnyezetben nem az volt az állítás, hogy egyik sql lekérdezés a másik sqlhez képest milyen, hanem az, hogy egy adott sql lekérdezés egy nem sql rendszerű, itt konkrétan hálós volt emlegetve, adatbáziskezelőhöz képest milyen. hát lassú.
Az eredeti mondat ez volt: "merthogy az sql masszívan nem hatékony akár a hálós adatbáziskezelőket nézed, " és igen, az sql rohadtul nem hatékony egy hálós adatbáziskezelőhöz képest, pláne, ha a lekérdezés olyan, amire a hálóst tervezték.
a személy meg a város kérdéskör meg akkor lesz érdekes, ha egy városból több személy van, pláne, ha nem egyszerre töltik be az adatokat, és akkor elkezdik a t. userek mindenféle néven illetni a településeket. ez még városoknál nem annyira nyilvánvaló, de én még nem láttam olyan adatbázist, ahol az utcaneveket képesek lettek volna egységesen írni. az meg, hogy ilyenkor nyakonvágjam a t. usert, kívánatos, de nem lehetséges megoldás
no mindegy, járod a magad útját, oszt jónapot.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
olvasgatom ezt a remek mysql doksit, ilyenek vannak benne:
- az enumos oszlop típusa lehet string vagy int. remek.
- ha beszúrsz egy nemlétező értékkel rendelkező rekordot, akkor simán lecseréli üres stringre.
- számokat csak stringként lehet belerakni, így ha egy gyengén típusos nyelvvel kérdezed le, mint az nagy divat, akkor nem tudod eldönteni, hogy mit adott vissza az sql szerver.hát szóval lehet, hogy nem sért adatbázistervezési szabályt (egyelőre még nem találtam meg a bizonyítékot ), de hogy az implementációjától sírva kirohannék a világból, az biztos.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
válasz sztanozs #2106 üzenetére
A bármi az nem az ms sql express.
Te azt mondtad, hogy az ilyen express kiadásoknak lehet komoly alternatívája a pg. szerintem meg nem, fullos oracle-nek, ms sql szervernek, stb. bárminek lehet. ha meg az ora és a pg árazását hasonlítom össze... nem is kell folytatnom a mondatot.Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz martonx #2109 üzenetére
amennyire követtem a dolgokat, normális clusterezési lehetőség csak a 9-es sorozatú pg-kben van, talán 9.3-tól. Azt nem tudom, rendes multimaster clustert lehet-e már építeni, egy master-sok slave cluster most már van.
A 8-as postgresekhez is volt külsős cluster szoftver, anno teszteltünk párat, nevetséges eredményt hozott. például ha session-id-t úgy akartál generálni, hogy volt benne random függvény is, akkor a cluster két darabján nem egyezett a két adat. now() függvény dettó. meg a tárolt procedúrákkal is baj volt.
"szerinted is"? én nem mondtam, hogy az oracle meg az mssql komolyan vehető adatbáziskezelő. az oracle tudását elismerem, de az árazása meg a ora.hu sales tevékenysége nálam több, mint kiütötte a biztosítékot.
a mysql-t nagyon régen teszteltem, lassú is volt, cserébe alap dolgokat sem tudott (ismétlem, a régi verzió), így nem foglalkoztam vele többet. meg amióta az ora felvásárolta, azóta a jövőjét elég ködösen látom.
nekem egy adatbáziskezelő van, ami komoly, a pg. minden hibája ellenére ezzel tudom legjobban megoldani a dolgaimat. (igen, van szubjektív rész is ebben a döntésben)
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
mikor legutoljára az ora.hu-tól kértem árajánlatot egy projektre, olyan számokat mondtak, hogy leestem a székről. megcsináltuk postgressel, erre elkezdtek kötözködni, hogy miért nem ora. hát azért, mert a teljes költségvetés hatszorosát kellett volna csak a db-re kiadni.
arra a feladatra, amire nekem kellett, a gyalog mysql gyorsabb volt, mint a gyalog pg, de elkezdtem behangolni mind a kettőt és a végén a pg porba alázta a mysql-t, pedig a mysql 8-as raid0-n volt, a pg meg sima diszken. akkoriban a mysql még tudott raidet, azóta ezt nem néztem.
már most tudom, mi lesz a következő néhány hsz tartalma
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
-
-
válasz kenesei1982 #2147 üzenetére
van magyar oracle, az nem jó?
supportot szerintem azoktól a cégektől vehetsz még, akik kompletten is supportálják az oprendszert, vagyis novell hungary, vagy ulx.hu. én ezen legutóbbival kezdeném.
szerk: esetleg keresd meg azt, aki ezt az állásajánlatot meghirdette.
[ Szerkesztve ]
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
válasz csabyka666 #2169 üzenetére
ha emlékeim nem csalnak, akkor regexpben (igazából kérdezni kellene, hogy pontosan melyikben, mert többféle van), a | az a logikai vagy.
tehát a most|ezt|szeretném|megkeresni regexp az ennyi:
string='most' or string='ezt' or string='szeretném' or string='megkeresni'a like az csak csonkolni tud, vagyis részstringet keres, a regexp meg ennél bonyolultabbat is tud, cserébe legalább lassú.
"Ha LIKE-ot használok, az a szóközzel nem tud mit kezdeni.": miért ne tudna?
"Viszont a REGEXP-nél meg tudom azt oldani, hogy a beírt stringben lecserélem a szóközöket | jelekre, és odaadom az SQL lekérdezésnek.": igen, és a fentiek alapján ezzel teljesen más keresőkifejezést alkottál, mint ami az eredeti volt.
[ Szerkesztve ]
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz csabyka666 #2172 üzenetére
szerintem nem jó ötlet a php-t dolgoztatni olyan dolgokkal, amit az adatbáziskezelő helyből hatékonyan megold. tehát a keresési találatok metszetét nem php-ben kell megoldani, hanem sql szinten.
egy kósza javaslat:
select distinct id from table where mezo1 like '%akarmi1%' or mezox like '%akarmin%' ... ;Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz csabyka666 #2174 üzenetére
nem jól érted.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz csabyka666 #2177 üzenetére
a dolog lényege, hogy php-ben összefaragod stringműveletekkel a keresési feltételt, és utána egy keresést futtatsz, mert ha több utasításban keresel, akkor a distinctből falra hányt borsó lesz.
azt nem értettem eddig a kérdésedben, hogy neked a keresőszót több mezőn is egyszerre kellene értelmezni, eddig azt hittem, csak egyen.
erre meg az a megoldás, hogy az adatbáziskezelővel összerakatod egy stringbe az összes mezőt, amiben keresni akarsz, és arra adod meg a kereső kifejezést.tehát ha van mondjuk egy név, egy leírás, egy gyártó meződ, akkor valahogy így:
név||'|'||leírás||'|'||gyártó like '%elsőkeresőszó%' (postgresql szintaktikával, a || a postgresben string konkatenáció)
és ebből csinálsz logikai vagy-gyal függvényt. vagy csinálni kell rá egy nézettáblát, amin keresel, az lehet, gyorsabb.
magyarul keresel egy olyan karaktert, ami biztosan nem fordul elő az adatokban, hogy elválaszd a szavakat (nekem erre a csővezetékjel a kedvenc), és az összes mező tartalmát összerakod egy stringbe ezzel a jellel elválasztva, majd ezen a stringen csinálod a like-ot. ez egy logikai kifejezés, ebből csinálsz vagy-gyal egy végső logikai kifejezést.
másik, nem annyira elegáns megoldás, ha csinálsz egy külön táblát, amibe ideiglenesen tárolod a keresések részhalmazait, csak akkor ott figyelni kell rá, hogy párhuzamos használat esetén mi lesz.
szóval egy táblába beleszórod azokat az azonosítókat, amely rekordokban az aktuális keresőszó megvan, majd csinálsz egy selectet belőle, distinct-tel, valahogy így:for i in (keresendő szavak listája sorban); do
for j in (keresett mezők listája sorban); do
sql="insert into temptabla (id) select id from tabla where $j like '%$i%';
done
done
select distinct id from temptabla;ez nyilván nem helyes program, csak egy utalás arra, hogy hogyan kellene. szerintem ez a második megoldás kicsit parasztos, de mindegy...
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
válasz csabyka666 #2177 üzenetére
a te megoldáshodhoz:
lehet azt csinálni, hogy or-ral összerakod a keresőkifejezést egy keresésre, ami lehet az, hogy egy keresendő szó minden mezőre kifejtve vagy lehet egy mező minden keresőszóra kifejtve.
amit visszaad, azt beolvasod egy ciklussal tömbbe.
utána ismétled az egészet tovább, megint beolvasod tömbbe, képezed a metszetet, és ezt csinálod ciklikusan. de ez nekem nem tűnik elegánsnak.Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis