Forum » Programiranje » Vprašanje za SQL poznavalce
Vprašanje za SQL poznavalce
urosbe ::
Hy!
Imam preprosto tabelo...
tblIskalec
iskalec_id (int)
iskalec_naziv (nvarchar)
iskalec_vrednosti (nvarchar)
... ki je nafilana z naslednjimi vrednostmi:
iskalec_id iskalec_naziv iskalec_vrednosti
1 'test1' '1,2,3,7,15,20,21'
2 'test2' '20,21,27'
Kot rezultat bi rad dobil ID-je vseh iskalcev, ki imajo v polju "iskalec_vrednost" vrednost 2
Začetna ideja je bila:
SELECT iskalec_id FROM tblIskalec WHERE '2' IN (1,2,3,7,15,20,21)
Vrednosti 1,2,3,7,15,20,21 sem poskušal torej zamenjati z stolpcem "iskalec_vrednosti", vendar to ne deluje
SELECT iskalec_id FROM tblIskalec WHERE '2' IN (iskalec_vrednosti)
Tole sicer deluje, vendar rezultat ne bo čisto točen, saj bo poleg ID=1 vrnil tudi ID=2, saj gleda zgolj po števkah (20 je torej v tem primeru sprejemljiva vrednost zanj, zame pa ne, saj iščem zgolj vrednost 2)
SELECT iskalec_id FROM tblIskalec WHERE iskalec_vrednosti LIKE '%2%'
S tem, da rešitev, kjer bi moral dodati še eno tabelo ne pride v poštev. Npr.
Nova tabela tblIskalec_Vrednosti, ki bi se vezala na to prvotno, torej v stilu
iskalec_fk vrednost
1 1
1 2
1 3
1 7
1 15
... ...
ter nato vrednost dobiš s stavkom:
SELECT iskalec_id FROM tblIskalec WHERE '2' IN (SELECT vrednost FROM tblIskalec_Vrednosti)
To ne pride v poštev. Vrednosti morajo biti zapisane v polju kot so zgoraj.
Obstaja kakšna preprosta rešitev, pa da je ne poznam?
LP
Uroš
Imam preprosto tabelo...
tblIskalec
iskalec_id (int)
iskalec_naziv (nvarchar)
iskalec_vrednosti (nvarchar)
... ki je nafilana z naslednjimi vrednostmi:
iskalec_id iskalec_naziv iskalec_vrednosti
1 'test1' '1,2,3,7,15,20,21'
2 'test2' '20,21,27'
Kot rezultat bi rad dobil ID-je vseh iskalcev, ki imajo v polju "iskalec_vrednost" vrednost 2
Začetna ideja je bila:
SELECT iskalec_id FROM tblIskalec WHERE '2' IN (1,2,3,7,15,20,21)
Vrednosti 1,2,3,7,15,20,21 sem poskušal torej zamenjati z stolpcem "iskalec_vrednosti", vendar to ne deluje
SELECT iskalec_id FROM tblIskalec WHERE '2' IN (iskalec_vrednosti)
Tole sicer deluje, vendar rezultat ne bo čisto točen, saj bo poleg ID=1 vrnil tudi ID=2, saj gleda zgolj po števkah (20 je torej v tem primeru sprejemljiva vrednost zanj, zame pa ne, saj iščem zgolj vrednost 2)
SELECT iskalec_id FROM tblIskalec WHERE iskalec_vrednosti LIKE '%2%'
S tem, da rešitev, kjer bi moral dodati še eno tabelo ne pride v poštev. Npr.
Nova tabela tblIskalec_Vrednosti, ki bi se vezala na to prvotno, torej v stilu
iskalec_fk vrednost
1 1
1 2
1 3
1 7
1 15
... ...
ter nato vrednost dobiš s stavkom:
SELECT iskalec_id FROM tblIskalec WHERE '2' IN (SELECT vrednost FROM tblIskalec_Vrednosti)
To ne pride v poštev. Vrednosti morajo biti zapisane v polju kot so zgoraj.
Obstaja kakšna preprosta rešitev, pa da je ne poznam?
LP
Uroš
OwcA ::
Kak podatkovni tip je iskalec_vrednost?
Če je niz ali kaj podobnega, lahko poskusiš iskati ,2,.
Če je niz ali kaj podobnega, lahko poskusiš iskati ,2,.
Otroška radovednost - gonilo napredka.
urosbe ::
Nvarchar je ja, ampak je problem, če bi iskal LIKE '%,2,%', kaj če je ta dvojka v polju na začetku ali koncu, torej:
2,3,4,5,20,54
ali
1,2
potem ,2, odpade?
2,3,4,5,20,54
ali
1,2
potem ,2, odpade?
Ziga Dolhar ::
Kaj če bi tip polja spremenil v SET?
Sicer pa, kadar imaš "pripenjanje" z multiplikanco >1, jaz najraje ustvarim novo tabelo.
Sicer pa, kadar imaš "pripenjanje" z multiplikanco >1, jaz najraje ustvarim novo tabelo.
https://dolhar.si/
OwcA ::
če bi iskal LIKE '%,2,%', kaj če je ta dvojka v polju na začetku ali koncu, torej:
Ah ja,
LIKE '%,2,%' OR LIKE '2,%' OR LIKE '2' OR LIKE '%,2' ...
Obstajajo pa seveda tudi boljše rešitve.
Otroška radovednost - gonilo napredka.
urosbe ::
Aha, tole je rešitev ja, druga bi pa bila, da bi številke spremenil v:
[1],[2],[3],[22] ...
Potem bi LIKE '%[2]%' deloval brez problema in našel prave vrednosti.
[1],[2],[3],[22] ...
Potem bi LIKE '%[2]%' deloval brez problema in našel prave vrednosti.
Zgodovina sprememb…
- spremenil: urosbe ()
Ziga Dolhar ::
Btw, kater izraz se v "slovenščini" uporablja za "multiplicity"?
--
Samodopolnitev: slovar ponuja "mnogoterost", "mnoštvo", "množina"
--
Samodopolnitev: slovar ponuja "mnogoterost", "mnoštvo", "množina"
https://dolhar.si/
urosbe ::
Oz. pomota, tvoja rešitev ne deluje pravilno. Pravilne rezultate dobiš le za:
LIKE '%,2,%' ............. 1,2, -- >
LIKE '2,%' ............. 2, -- >
LIKE '%,2' ............. < -- ,2
Zaenkrat edina pravilna bi bila, da opremim vrednosti z [ ].
LP
Uroš
LIKE '%,2,%' ............. 1,2, -- >
LIKE '2,%' ............. 2, -- >
LIKE '%,2' ............. < -- ,2
Zaenkrat edina pravilna bi bila, da opremim vrednosti z [ ].
LP
Uroš
Zgodovina sprememb…
- spremenil: urosbe ()
OwcA ::
tvoja rešitev ne deluje pravilno. Pravilne rezultate dobiš le za:
???
Otroška radovednost - gonilo napredka.
urosbe ::
V mislih sem imel, če imaš v polju le vrednost 2, ampak preprosto poleg tvojih pogojev dodaš še LIKE '2' in stvar zalaufa. Sedaj testiram, katera bi bila hitrejša.
OwcA ::
Da ne bo še kakšnih nesporazumov, pred vsakim like mora biti seveda še ime polja.
Otroška radovednost - gonilo napredka.
urosbe ::
Pa res, sory moja napaka, ker sem spregledal. Torej imam dve rešitvi, ki za 4000 zapisov delujeta enako hitro (oz. sta hitrejši da bi računalnik dojel in zapisal čas 00:00:00).
zavajon ::
Naredi funkcijo, ki ti splita vrednosti po delimiterju ','.
Tako funkcijo dobiš tukaj.
Nato narediš funkcijo nekako tako:
CREATE FUNCTION has_value (@p_string nvarchar,@p_value nvarchar)
RETURNS bit AS
BEGIN
declare @ret bit
SELECT @ret = 0
SELECT @ret = (SELECT 1
FROM dbo.udf_Txt_SplitTAB(@p_string, ',')
WHERE item = @p_value)
RETURN @ret
END
To uporabiš tako:
select iskalec_vrednosti,dbo.vsebuje(iskalec_vrednosti,'2') ima_2 FROM tbliskalec
lp
Tako funkcijo dobiš tukaj.
Nato narediš funkcijo nekako tako:
CREATE FUNCTION has_value (@p_string nvarchar,@p_value nvarchar)
RETURNS bit AS
BEGIN
declare @ret bit
SELECT @ret = 0
SELECT @ret = (SELECT 1
FROM dbo.udf_Txt_SplitTAB(@p_string, ',')
WHERE item = @p_value)
RETURN @ret
END
To uporabiš tako:
select iskalec_vrednosti,dbo.vsebuje(iskalec_vrednosti,'2') ima_2 FROM tbliskalec
lp
BigWhale ::
> LIKE '%,2,%' OR LIKE '2,%' OR LIKE '2' OR LIKE '%,2' ...
*cringe* Potem mu se povej, naj ne dela indexov, ker so neuporabni ;>
*cringe* Potem mu se povej, naj ne dela indexov, ker so neuporabni ;>
urosbe ::
Super, sem stestiral in deluje, vendar sem potem kar tisto stvar z [ ] uporabil, saj je v primerjavi s to (user defined funckijo) hitrejša (funckija porabi cca 3 sekunde za 4000 zapisov, medtem ko prva varianta 0 sekund - v momentu).
Hvala vsem za nasvete!
LP
Uroš
Hvala vsem za nasvete!
LP
Uroš
zdravc ::
Uporaba oklepajev je malo nerodna. Problem je samo v tem v da polju v katerem imas nabor vrednosti umetno dodaš spredaj in zadaj vejico s posebnim znakom ||.
Primer:
SELECT iskalec_id FROM tblIskalec WHERE ','||'2'||',' LIKE ','||iskalec_vrednosti||','
'2' lahko zamenjas s poljem v katerem imas vrednost, ki jo isces.
Druga varianta je ukaz INSTR, ki ti v polju vrednosti poisce vrednost iz drugega polja.
Primer:
SELECT iskalec_id FROM tblIskalec WHERE ','||'2'||',' LIKE ','||iskalec_vrednosti||','
'2' lahko zamenjas s poljem v katerem imas vrednost, ki jo isces.
Druga varianta je ukaz INSTR, ki ti v polju vrednosti poisce vrednost iz drugega polja.
kdor zna pa žih
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | MySQL pomocOddelek: Izdelava spletišč | 1843 (1099) | slosi |
» | [Access 2007]Oddelek: Programiranje | 2627 (2227) | urosz |
» | [Access] iskanje z formom / querijemOddelek: Programiranje | 1332 (1256) | zagy |
» | [Java][Naloga] Seznam študentov, majčken problemOddelek: Programiranje | 2312 (1999) | VASkO |
» | problem s prekrivanjem likovOddelek: Programiranje | 1503 (1426) | McAjvar |