[MS SQL] Wyswietlanie fragmentu komorki tekstowej
Mariusz M. - 14-08-2007 00:05
[MS SQL] Wyswietlanie fragmentu komorki tekstowej
Witam. Mam następujący problem z zapytaniem do bazy MS SQL:
Mam komorke ablok.name zapisana nastepujaco jako tekst:
a / b / c / d a / b / c a / b / c / d itd.
Chce wyciagnac ostatni czlon (d). Myslalem ze poradze sobie w sposob jak ponizej, czyli uzywajac zagniezdzonych substring i charindex, jednak to dziala prawidlowo tylko dla wartosci cztero-czlonowych. Gdy sa trzy wartosci, to charindex wyszukujac (i nie znajdujac znaku ukosnika w koncowej fazie) zwraca pozycje c zamiast d.
Czy jedynym wyjsciem jest uzyc funkcji T-SQL, ktorego w tej chwili nie znam? Moze jest jakis inny sposob?
SELECT
SUBSTRING (SUBSTRING (SUBSTRING(ablok.name, CHARINDEX('/',ablok.name)+2,100), CHARINDEX('/',SUBSTRING(ablok.name, CHARINDEX('/',ablok.name)+2,100))+2,100), CHARINDEX('/', SUBSTRING(SUBSTRING(ablok.name, CHARINDEX('/',ablok.name)+2,100),CHARINDEX('/',SUBSTRING(ablok.name, CHARINDEX('/',ablok.name)+2,100))+2,100))+2,100
)
-- Pozdrawiam Mariusz
brejk - 14-08-2007 00:05
On 13 Sie, 16:00, "Mariusz M." <rally_...@op.pl> wrote: > Witam. Mam następujący problem z zapytaniem do bazy MS SQL: > > Mam komorke ablok.name zapisana nastepujaco jako tekst: > > a / b / c / d > a / b / c > a / b / c / d > itd. > > Chce wyciagnac ostatni czlon (d). Myslalem ze poradze sobie w sposob jak > ponizej, czyli uzywajac zagniezdzonych substring i charindex, jednak to > dziala prawidlowo tylko dla wartosci cztero-czlonowych. Gdy sa trzy > wartosci, to charindex wyszukujac (i nie znajdujac znaku ukosnika w koncowej > fazie) zwraca pozycje c zamiast d. > > Czy jedynym wyjsciem jest uzyc funkcji T-SQL, ktorego w tej chwili nie znam? > Moze jest jakis inny sposob? > > SELECT > > SUBSTRING > (SUBSTRING > (SUBSTRING(ablok.name, CHARINDEX('/',ablok.name)+2,100), > CHARINDEX('/',SUBSTRING(ablok.name, > CHARINDEX('/',ablok.name)+2,100))+2,100), > CHARINDEX('/', > SUBSTRING(SUBSTRING(ablok.name, > CHARINDEX('/',ablok.name)+2,100),CHARINDEX('/',SUBSTRING(ablok.name, > CHARINDEX('/',ablok.name)+2,100))+2,100))+2,100 > > ) > > -- > Pozdrawiam > Mariusz
SELECT CASE WHEN CHARINDEX('/',name) = 0 THEN name ELSE RIGHT(name,CHARINDEX('/',REVERSE(name))-1) END AS [Ostatni czlon] FROM ablok
A jak masz po znaku "/" spacje, to możesz zrobić tak:
SELECT CASE WHEN CHARINDEX('/',name) = 0 THEN name ELSE RIGHT(REPLACE(name,' / ','/'),CHARINDEX('/',REVERSE(REPLACE(name,' / ','/')))-1) END AS [Ostatni czlon] FROM ablok
Mariusz M. - 15-08-2007 00:00
Użytkownik "brejk" <pawel.potasinski@gmail.com> napisał w wiadomości news:1187023247.034286.229230@57g2000hsv.googlegro ups.com...
> A jak masz po znaku "/" spacje, to możesz zrobić tak:
> SELECT CASE > WHEN CHARINDEX('/',name) = 0 THEN name > ELSE RIGHT(REPLACE(name,' / > ','/'),CHARINDEX('/',REVERSE(REPLACE(name,' / ','/')))-1) > END AS [Ostatni czlon] > FROM ablok
Mam spacje zarówno przed, jak i po /. To zapytanie wyswietla mi ostatni czlon, ale rowniez wtedy, gdy sa trzy wartosci.
Jakies pomysły?
-- Pozdrawiam Mariusz
brejk - 15-08-2007 00:00
On 14 Sie, 10:26, "Mariusz M." <rally_...@op.pl> wrote: > Użytkownik "brejk" <pawel.potasin...@gmail.com> napisał w wiadomościnews:1187023247.034286.229230@57g2000hsv .googlegroups.com... > > > A jak masz po znaku "/" spacje, to możesz zrobić tak: > > SELECT CASE > > WHEN CHARINDEX('/',name) = 0 THEN name > > ELSE RIGHT(REPLACE(name,' / > > ','/'),CHARINDEX('/',REVERSE(REPLACE(name,' / ','/')))-1) > > END AS [Ostatni czlon] > > FROM ablok > > Mam spacje zarówno przed, jak i po /. To zapytanie wyswietla mi ostatni > czlon, ale rowniez wtedy, gdy sa trzy wartosci. > > Jakies pomysły? > > -- > Pozdrawiam > Mariusz
Jezeli masz maksymalnie cztery wartosci i zalezy Ci na czwartej, jezeli takowa jest w komorce, to:
SELECT REVERSE( PARSENAME( REVERSE( REPLACE(name,' / ','.') ),4 ) ) FROM dbo.ablok
mattoid - 21-08-2007 00:07
Dnia Mon, 13 Aug 2007 16:00:21 +0200, Mariusz M. napisał(a):
> Mam komorke ablok.name zapisana nastepujaco jako tekst: > > a / b / c / d > a / b / c > a / b / c / d > itd. > > Chce wyciagnac ostatni czlon (d). Myslalem ze poradze sobie w sposob jak > ponizej, czyli uzywajac zagniezdzonych substring i charindex, jednak to > dziala prawidlowo tylko dla wartosci cztero-czlonowych. Gdy sa trzy > wartosci, to charindex wyszukujac (i nie znajdujac znaku ukosnika w koncowej > fazie) zwraca pozycje c zamiast d.
Czegoś chyba nie załapałem, ale niech tam... Po pierwsze strasznie namotałeś jak na mój gust. Jeśli chodzi Ci o to, żeby zwrócić ostatni człon w wierszu, to wystarczy zapytanie:
SELECT SUBSTRING(REVERSE(Tekst), 1, 1) FROM TABELA
Jeśli to nie jest to czego oczekiwałeś, to opisz dokładniej problem, bo zazwyczaj nie mam problemu z czytaniem ze zrozumieniem, a tym razem mi się nie udało :)
-- Pozdrawiam mattoid
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
[oracle] - Oracle SQL Developer - co to jest SID?
=?ISO-8859-2?Q?[Oracle]_Wywo=B3anie_skryptu_sh_z_PL/SQL-a=3F=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plshutter.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|