» »

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š

OwcA ::

Kak podatkovni tip je iskalec_vrednost?

Č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?

Ziga Dolhar ::

Kaj če bi tip polja spremenil v SET?

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.

Zgodovina sprememb…

  • spremenil: urosbe ()

Ziga Dolhar ::

Btw, kater izraz se v "slovenščini" uporablja za "multiplicity"?

--

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š

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.

kopernik ::

Saj v njegovih pogojih je tudi LIKE '2'

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

OwcA ::

Če uporabiš oglate oklepaje ne rabiš vejic. ;)
Otroška radovednost - gonilo napredka.

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

BigWhale ::

> LIKE '%,2,%' OR LIKE '2,%' OR LIKE '2' OR LIKE '%,2' ...

*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š

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.
kdor zna pa žih


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

MySQL pomoc

Oddelek: Izdelava spletišč
171870 (1126) slosi
»

[Access 2007]

Oddelek: Programiranje
132640 (2240) urosz
»

[Access] iskanje z formom / querijem

Oddelek: Programiranje
61343 (1267) zagy
»

[Java][Naloga] Seznam študentov, majčken problem

Oddelek: Programiranje
362324 (2011) VASkO
»

problem s prekrivanjem likov

Oddelek: Programiranje
61514 (1437) McAjvar

Več podobnih tem