[T-SQL] n'th woord in delimited string vinden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dakoina
  • Registratie: Februari 2002
  • Laatst online: 18-06 14:26

Dakoina

Newbie archer

Topicstarter
Ik ben op zoek naar een manier om een n-th woord uit een delimited string te halen, maar dan met T-SQL. Het is een bestaande functie in scripting taal van een bepaald software packet, maar ik zou die graag een TSQL versie voor in Sybase creëren.

Ik heb al redelijk wat gegoogled, en heb gemerkt dat het niet zo heel eenvoudig lijkt te zijn, maar ik heb nog steeds geen concreet antwoord gevonden en geraak er zelf niet echt meer aan uit.Mensen spreken van tijdelijke tabellen te maken en dergelijke meer, maar spreken niet over het n-de stukje string.

De SQL ervaring heb ik wel, maar de TSQL kant is nog niet zo heel sterk.

voorbeeldje:
- een veld met naam" mystring" bevat "abc|12345|mm|test|xxxx"
- een functie WORD(source, delimiter,n-th word)
--> WORD(mystring,'|',2) returns "12345"

maar dit dan in een TSQL syntax

Iemand die me kan helpen? Alvast bedankt

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Los van de opmerkingen die je gegarandeerd gaat krijgen over waarom die zooi überhaupt zo in de tabel zit: heb je al eens geprobeerd een UDF te maken? Met Charindex en Substring moet je een heel eind komen.

Even uit de losse pols:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* UDF params */
declare @value as nvarchar(max)
declare @separator as nvarchar(10)
declare @match as int

set @value = 'dit|is|een|test|woei'
set @separator = '|'
set @match = 1  -- 0-based

/* UDF vars */
declare @p as int
declare @f as int
declare @m as int

set @value = @value + @separator
set @m = 0
set @p = 0
set @f = CHARINDEX(@separator, @value);
While @f>0
begin
  if (@m = @match)
    print SUBSTRING(@value, @p, @f-@p) --RETURN HIER
  set @p = @f+LEN(@separator)
  set @f = CHARINDEX(@separator, @value, @f+LEN(@separator));
  set @m = @m + 1
end
--RETURN NULL hier

Nog even in een UDF gieten en eventueel een NULL returnen wanneer geen match... zoiets.
Overigens; normaliter leven we hier volgens het motto:
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
Dus eigenlijk heb ik je al teveel gegeven... O-)

[ Voor 89% gewijzigd door RobIII op 09-11-2010 10:36 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Dakoina
  • Registratie: Februari 2002
  • Laatst online: 18-06 14:26

Dakoina

Newbie archer

Topicstarter
RobIII schreef op dinsdag 09 november 2010 @ 10:15:
Los van de opmerkingen die je gegarandeerd gaat krijgen over waarom die zooi überhaupt zo in de tabel zit: heb je al eens geprobeerd een UDF te maken? Met Charindex en Substring moet je een heel eind komen.
... laten we zeggen, ik ben diegene die de zooi mag opruimen :)

Ik dacht wel dat ik aan een UDF moest beginnen, maar hoe, dat was me nog een raadsel.

Bedankt, ik ga het direct eens bestuderen!

[ Voor 61% gewijzigd door Dakoina op 09-11-2010 11:06 ]