Autor | Zpráva | ||
---|---|---|---|
mirio Profil |
#1 · Zasláno: 23. 8. 2012, 11:10:53
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 |
#2 · Zasláno: 23. 8. 2012, 11:25:52
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 |
#3 · Zasláno: 23. 8. 2012, 11:30:08
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 edit: drobné opravy v příspěvku a zpřesnění komentářů v dotazu |
||
Časová prodleva: 4 dny
|
|||
mirio Profil |
#5 · Zasláno: 27. 8. 2012, 11:01:49
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.
|
||
Časová prodleva: 9 měsíců
|
|||
vrt.ule Profil |
#6 · Zasláno: 9. 5. 2013, 17:06:36
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 :) |
||
Časová prodleva: 11 let
|
0