Autor Zpráva
mirio
Profil
Ahoj,

potřebuju se zeptat - mám v tabulce sloupec se seřazenými "id", např. takto: ";1;105;112;1150;". Vím, že řetězec, který potřebuji získat, je vždy mezi 2. a 3. středníkem - ";1;105;112;1150;".

Jak se k té "105" dostanu, prosím? Určitě bych měl použít string functions, ale nějak nevím, kterou a jak na to použít.

Děkuji za rady.
Joker
Profil
mirio:
Asi kombinace SUBSTRING a CHARINDEX, ale tohle v první řadě vypadá na špatný návrh databáze, viz Více hodnot ve sloupci ve zdejších FAQ.
mirio
Profil
Joker: To s tebou souhlasím, ale já ji nenavrhoval, prostě pracuju s tím, co jsem dostal... Proto hledám nějaké řešení.
Joker
Profil
mirio:
prostě pracuju s tím, co jsem dostal
Jenže tam je velké riziko, že s dalšími požadavky budou vznikat pořád horší problémy tohoto druhu, vyžadující stále krkolomnější řešení.
Proto doporučuji vynaložit maximální úsilí na úpravu datového modelu „dokud to jde“. Čím později se to udělá, tím horší to bude.

Jestli to opravdu nejde, tak jak jsem říkal, asi to půjde kombinováním SUBSTRING + CHARINDEX.
Ukázkový příklad:
DECLARE @data varchar(10);
SET @data = 'a;b;c;d';
DECLARE @begin int;
SET @begin = CHARINDEX(';', @data, CHARINDEX(';', @data) + 1)+1; -- začátek textu za druhým středníkem
DECLARE @length int;
SET @length = CHARINDEX(';',@data, @begin+1) - @begin; -- kolik je mezi druhým a třetím středníkem
SELECT SUBSTRING(@data, @begin, @length); -- text mezi druhým a třetím středníkem
(pozn.: Barvení kódu je pro MySQL, ale MSSQL tu pokud vím není a tohle mi přijde nejlepší varianta)

edit: drobné opravy v příspěvku a zpřesnění komentářů v dotazu
mirio
Profil
Joker: Děkuju, máš pravdu, že by se to udělat mělo, i když se mi do takového zásahu vůbec nechce.
vrt.ule
Profil
Ahoj,
mám podobný problém.
V jednom poli je XML záznam: ...<OpNumber>43</OpNumber><OpType>OU</OpType>... a já bych potřebovala získat právě to číslo 43 (přičemž dané číslo je různě dlouhé, takže mě zajímá vše, co je zapsáno mezi <OpNumber> a </OpNumber>. Též nejsem nadšená, že zrovna toto pole obsahuje celé XMLko, ale bohužel je spravovaná jinou institucí a my se k ní jen připojujeme.
Díky za radu
quinux
Profil
vrt.ule:
SELECT NAZEV_SLOUPCE.value('(OpNumber)[1]','varchar(max)') AS MUJ_NAZEV FROM tabulka

je to pro MS SQL, takže pokud je to jiná DB, tak nevím jestli to bude fungovat a samozřejmě je-li to XML obaleno nějakým rootvým elementem, tak by to byo třeba data/OpNumber
vrt.ule
Profil
Díky,
nakonec jsem včera nějak procitla a objevila funkci CHARINDEX, takže můj výsledek ve finále vypadá následovně:

select substring(prof.clientinfo,CHARINDEX('<OpNumber>',prof.nazev_sloupce,1)+10,(CHARINDEX('</OpNumber>',prof.nazev_sloupce,1)-(CHARINDEX('<OpNumber>',prof.nazev_sloupce,1)+10))) as vysledek
from nazev_tabulky prof;

Třeba se to někomu hodí do budoucna :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: