<?xml version="1.0" encoding="utf-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Writing a pure SQL based String Tokenizer</title>
	<atom:link href="http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/feed" rel="self" type="application/rss+xml" />
	<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer</link>
	<description>Weblog for the AMIS Technology corner</description>
	<lastBuildDate>Fri, 10 Feb 2012 16:47:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Paul Schaap</title>
		<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/comment-page-1#comment-245537</link>
		<dc:creator>Paul Schaap</dc:creator>
		<pubDate>Mon, 09 Jul 2007 09:42:08 +0000</pubDate>
		<guid isPermaLink="false">http://technology.amis.nl/blog/?p=1631#comment-245537</guid>
		<description>SELECT SUBSTR(X,Y + 1, Z - 1 - Y)
FROM (
    SELECT X, INSTR(X,DELIMITER,1,ROWNUM) Y, INSTR(X,DELIMITER,1,ROWNUM+1) Z
    FROM (SELECT &#039;,&#039; &#124;&#124; &#039;A,BB,CC&#039; &#124;&#124; &#039;,&#039; X, &#039;,&#039; DELIMITER FROM DUAL), ALL_TABLES
    WHERE INSTR(X,DELIMITER,1,ROWNUM+1) != 0
)</description>
		<content:encoded><![CDATA[<p>SELECT SUBSTR(X,Y + 1, Z &#8211; 1 &#8211; Y)<br />
FROM (<br />
    SELECT X, INSTR(X,DELIMITER,1,ROWNUM) Y, INSTR(X,DELIMITER,1,ROWNUM+1) Z<br />
    FROM (SELECT &#8216;,&#8217; || &#8216;A,BB,CC&#8217; || &#8216;,&#8217; X, &#8216;,&#8217; DELIMITER FROM DUAL), ALL_TABLES<br />
    WHERE INSTR(X,DELIMITER,1,ROWNUM+1) != 0<br />
)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vizith</title>
		<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/comment-page-1#comment-199009</link>
		<dc:creator>Vizith</dc:creator>
		<pubDate>Mon, 26 Feb 2007 06:00:15 +0000</pubDate>
		<guid isPermaLink="false">http://technology.amis.nl/blog/?p=1631#comment-199009</guid>
		<description>hi guyz i tried to develop a number puzzle in forms6i got strucked in middle .. can any one help me out ..
declare 
		temp varchar2(40);
		lbl varchar2(40);
begin
		lbl:=get_item_property(name_in(&#039;system.trigger_item&#039;),label);
	temp:= :system.trigger_item;
	if get_item_property(temp,VISIBLE)= &#039;TRUE&#039; then
		set_item_property(:parameter.HIDENUM,VISIBLE,PROPERTY_TRUE);
		set_item_property(:parameter.HIDENUM,ENABLED,PROPERTY_TRUE);
		set_item_property(:parameter.HIDENUM,label,lbl);
		go_item(:parameter.HIDENUM);
		set_item_property(temp,VISIBLE,PROPERTY_FALSE);	
		:parameter.HIDENUM:=temp;
	end if;
	/*if get_item_property(&#039;number_game.TWO&#039;,displayed)=&#039;TRUE&#039; then
		set_item_property(&#039;number_game.TWO&#039;,displayed,&#039;FALSE&#039;);
	end if;
	if  get_item_property(&#039;number_game.THREE&#039;,displayed)=&#039;TRUE&#039; then
		set_item_property(&#039;number_game.THREE&#039;,displayed,&#039;FALSE&#039;);
		end if;*/
if lbl =&#039;EXIT&#039; then exit_form(no_validate);
end if;
end;</description>
		<content:encoded><![CDATA[<p>hi guyz i tried to develop a number puzzle in forms6i got strucked in middle .. can any one help me out ..<br />
declare<br />
		temp varchar2(40);<br />
		lbl varchar2(40);<br />
begin<br />
		lbl:=get_item_property(name_in(&#8217;system.trigger_item&#8217;),label);<br />
	temp:= :system.trigger_item;<br />
	if get_item_property(temp,VISIBLE)= &#8216;TRUE&#8217; then<br />
		set_item_property(:parameter.HIDENUM,VISIBLE,PROPERTY_TRUE);<br />
		set_item_property(:parameter.HIDENUM,ENABLED,PROPERTY_TRUE);<br />
		set_item_property(:parameter.HIDENUM,label,lbl);<br />
		go_item(:parameter.HIDENUM);<br />
		set_item_property(temp,VISIBLE,PROPERTY_FALSE);<br />
		:parameter.HIDENUM:=temp;<br />
	end if;<br />
	/*if get_item_property(&#8216;number_game.TWO&#8217;,displayed)=&#8217;TRUE&#8217; then<br />
		set_item_property(&#8216;number_game.TWO&#8217;,displayed,&#8217;FALSE&#8217;);<br />
	end if;<br />
	if  get_item_property(&#8216;number_game.THREE&#8217;,displayed)=&#8217;TRUE&#8217; then<br />
		set_item_property(&#8216;number_game.THREE&#8217;,displayed,&#8217;FALSE&#8217;);<br />
		end if;*/<br />
if lbl =&#8217;EXIT&#8217; then exit_form(no_validate);<br />
end if;<br />
end;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Andreas</title>
		<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/comment-page-1#comment-198900</link>
		<dc:creator>Andreas</dc:creator>
		<pubDate>Sun, 25 Feb 2007 23:10:04 +0000</pubDate>
		<guid isPermaLink="false">http://technology.amis.nl/blog/?p=1631#comment-198900</guid>
		<description>
Hi,
I found and already used a nice solution from O&#039;Reillys &quot;SQL Cookbook&quot;.
Those days I needed to convert delimited data into a multi-valued IN-List.
I just changed the query a bit to work as a string tokenizer. See:

SELECT RTRIM(
                       SUBSTR( x.token
                     , INSTR(x.token, &#039;&amp;Delimiter&#039;, 1, iter.pos) + 1
                     ,INSTR(x.token, &#039;&amp;Delimiter&#039;, 1, iter.pos + 1) - INSTR(x.token, &#039;&amp;Delimiter&#039;, 1, iter.pos)
                     )
                     , &#039;&amp;Delimiter&#039;
           ) token
           , iter.pos AS Position
    FROM (SELECT &#039;&amp;Delimiter&#039; &#124;&#124; &#039;&amp;StringToTokenize&#039; &#124;&#124; &#039;&amp;Delimiter&#039; token
                 FROM dual
              ) x
           , (SELECT rownum AS pos
                 FROM all_objects
             ) iter
 WHERE iter.pos </description>
		<content:encoded><![CDATA[<p>Hi,<br />
I found and already used a nice solution from O&#8217;Reillys &quot;SQL Cookbook&quot;.<br />
Those days I needed to convert delimited data into a multi-valued IN-List.<br />
I just changed the query a bit to work as a string tokenizer. See:</p>
<p>SELECT RTRIM(<br />
                       SUBSTR( x.token<br />
                     , INSTR(x.token, &#8216;&amp;Delimiter&#8217;, 1, iter.pos) + 1<br />
                     ,INSTR(x.token, &#8216;&amp;Delimiter&#8217;, 1, iter.pos + 1) &#8211; INSTR(x.token, &#8216;&amp;Delimiter&#8217;, 1, iter.pos)<br />
                     )<br />
                     , &#8216;&amp;Delimiter&#8217;<br />
           ) token<br />
           , iter.pos AS Position<br />
    FROM (SELECT &#8216;&amp;Delimiter&#8217; || &#8216;&amp;StringToTokenize&#8217; || &#8216;&amp;Delimiter&#8217; token<br />
                 FROM dual<br />
              ) x<br />
           , (SELECT rownum AS pos<br />
                 FROM all_objects<br />
             ) iter<br />
 WHERE iter.pos</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Gary</title>
		<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/comment-page-1#comment-195912</link>
		<dc:creator>Gary</dc:creator>
		<pubDate>Fri, 09 Feb 2007 00:39:01 +0000</pubDate>
		<guid isPermaLink="false">http://technology.amis.nl/blog/?p=1631#comment-195912</guid>
		<description>(Sorry,the PRE tags got stripped)</description>
		<content:encoded><![CDATA[<p>(Sorry,the PRE tags got stripped)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Gary</title>
		<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/comment-page-1#comment-195911</link>
		<dc:creator>Gary</dc:creator>
		<pubDate>Fri, 09 Feb 2007 00:35:59 +0000</pubDate>
		<guid isPermaLink="false">http://technology.amis.nl/blog/?p=1631#comment-195911</guid>
		<description>My own variant using the MODEL clause

SELECT var_list, var_list2
FROM ( select &#039;red,blue,yellow&#039; var_list,&#039;,&#039; delim  from dual ) 
MODEL
PARTITION BY (var_list, delim)
DIMENSION BY (0 AS z)
MEASURES (var_list var_list2,
         0 vcnt, 0 as vstart, 0 as vend)
  RULES ITERATE (4000) UNTIL (ITERATION_NUMBER+1 = vcnt[0] )
      (vcnt[ITERATION_NUMBER]=
          nvl(length(cv(var_list)) - length(replace(cv(var_list),cv(delim))) + 1,1),
      vstart[ITERATION_NUMBER] =
         case when ITERATION_NUMBER = 0 then 1
              else instr(cv(var_list),cv(delim),1,ITERATION_NUMBER)+1 end,
      vend[ITERATION_NUMBER] =
           case when nvl(instr(cv(var_list),cv(delim),1,ITERATION_NUMBER+1),0) = 0
                  then nvl(length(cv(var_list))+1,1)
                else instr(cv(var_list),cv(delim),1,ITERATION_NUMBER+1) end,
      var_list2[ITERATION_NUMBER] =
          substr(cv(var_list),vstart[ITERATION_NUMBER],
                              vend[ITERATION_NUMBER] - vstart[ITERATION_NUMBER])
      )
order by var_list, vstart;
</description>
		<content:encoded><![CDATA[<p>My own variant using the MODEL clause</p>
<p>SELECT var_list, var_list2<br />
FROM ( select &#8216;red,blue,yellow&#8217; var_list,&#8217;,&#8217; delim  from dual )<br />
MODEL<br />
PARTITION BY (var_list, delim)<br />
DIMENSION BY (0 AS z)<br />
MEASURES (var_list var_list2,<br />
         0 vcnt, 0 as vstart, 0 as vend)<br />
  RULES ITERATE (4000) UNTIL (ITERATION_NUMBER+1 = vcnt[0] )<br />
      (vcnt[ITERATION_NUMBER]=<br />
          nvl(length(cv(var_list)) &#8211; length(replace(cv(var_list),cv(delim))) + 1,1),<br />
      vstart[ITERATION_NUMBER] =<br />
         case when ITERATION_NUMBER = 0 then 1<br />
              else instr(cv(var_list),cv(delim),1,ITERATION_NUMBER)+1 end,<br />
      vend[ITERATION_NUMBER] =<br />
           case when nvl(instr(cv(var_list),cv(delim),1,ITERATION_NUMBER+1),0) = 0<br />
                  then nvl(length(cv(var_list))+1,1)<br />
                else instr(cv(var_list),cv(delim),1,ITERATION_NUMBER+1) end,<br />
      var_list2[ITERATION_NUMBER] =<br />
          substr(cv(var_list),vstart[ITERATION_NUMBER],<br />
                              vend[ITERATION_NUMBER] &#8211; vstart[ITERATION_NUMBER])<br />
      )<br />
order by var_list, vstart;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Lucas Jellema</title>
		<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/comment-page-1#comment-195861</link>
		<dc:creator>Lucas Jellema</dc:creator>
		<pubDate>Thu, 08 Feb 2007 15:19:27 +0000</pubDate>
		<guid isPermaLink="false">http://technology.amis.nl/blog/?p=1631#comment-195861</guid>
		<description>Gentlemen, you have started your engines! Two beatiful solutions, that surpass my original proposal. Thanks for sharing your ideas!

Lucas</description>
		<content:encoded><![CDATA[<p>Gentlemen, you have started your engines! Two beatiful solutions, that surpass my original proposal. Thanks for sharing your ideas!</p>
<p>Lucas</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: anton</title>
		<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/comment-page-1#comment-195843</link>
		<dc:creator>anton</dc:creator>
		<pubDate>Thu, 08 Feb 2007 11:43:43 +0000</pubDate>
		<guid isPermaLink="false">http://technology.amis.nl/blog/?p=1631#comment-195843</guid>
		<description>&lt;p&gt;
My thoughts about this (only because you asked for it :) ):

&lt;/p&gt;&lt;pre&gt;with input as &lt;br /&gt;( select &#039;red,blue,yellow&#039; string_to_tokenize &lt;br /&gt;  , &#039;,&#039; delimiter &lt;br /&gt;  from dual &lt;br /&gt;)&lt;br /&gt;, temp as &lt;br /&gt;( select delimiter &#124;&#124; string_to_tokenize &#124;&#124; delimiter stt &lt;br /&gt;, delimiter del &lt;br /&gt;  from input &lt;br /&gt;) &lt;br /&gt;select substr( stt, instr( stt, del, 1, d ) + 1&lt;br /&gt;,      instr( stt, del, 1, d + 1 ) - instr( stt, del, 1, d ) - 1 ) &lt;br /&gt;from   temp &lt;br /&gt;model &lt;br /&gt;  partition by ( stt, del ) &lt;br /&gt;  dimension by ( 0 x ) &lt;br /&gt;  measures ( 1 d, ( select length( translate( stt, del &#124;&#124; stt, del ) ) - 2 &lt;br /&gt;                    from   temp &lt;br /&gt;                  ) noe &lt;br /&gt;            ) &lt;br /&gt;  rules iterate( 1000 ) &lt;br /&gt;  until iteration_number &gt;= noe[0] ( d[iteration_number] = iteration_number + 1 ) &lt;br /&gt;&lt;/pre&gt;&lt;p&gt;For the thoughts of some other people on something simulare, see Adrian&#039;s Oracle Page at http://mysite.wanadoo-members.co.uk/adriansoraclepages/demos/10g/scripts/string_to_table_sql_only.sql
Anton&lt;/p&gt;</description>
		<content:encoded><![CDATA[<p>
My thoughts about this (only because you asked for it <img src='http://technology.amis.nl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ):</p>
<pre>with input as ( select 'red,blue,yellow' string_to_tokenize   , ',' delimiter   from dual ), temp as ( select delimiter || string_to_tokenize || delimiter stt , delimiter del   from input ) select substr( stt, instr( stt, del, 1, d ) + 1,      instr( stt, del, 1, d + 1 ) - instr( stt, del, 1, d ) - 1 ) from   temp model   partition by ( stt, del )   dimension by ( 0 x )   measures ( 1 d, ( select length( translate( stt, del || stt, del ) ) - 2                     from   temp                   ) noe             )   rules iterate( 1000 )   until iteration_number &gt;= noe[0] ( d[iteration_number] = iteration_number + 1 ) </pre>
<p>For the thoughts of some other people on something simulare, see Adrian&#8217;s Oracle Page at <a href="http://mysite.wanadoo-members.co.uk/adriansoraclepages/demos/10g/scripts/string_to_table_sql_only.sql" rel="nofollow">http://mysite.wanadoo-members.co.uk/adriansoraclepages/demos/10g/scripts/string_to_table_sql_only.sql</a><br />
Anton</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Patrick Wolf</title>
		<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/comment-page-1#comment-195841</link>
		<dc:creator>Patrick Wolf</dc:creator>
		<pubDate>Thu, 08 Feb 2007 11:34:29 +0000</pubDate>
		<guid isPermaLink="false">http://technology.amis.nl/blog/?p=1631#comment-195841</guid>
		<description>BTW, is there a way to format code in a comment? Because all the line brakes are gone. :-(</description>
		<content:encoded><![CDATA[<p>BTW, is there a way to format code in a comment? Because all the line brakes are gone. <img src='http://technology.amis.nl/blog/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Patrick Wolf</title>
		<link>http://technology.amis.nl/blog/1631/writing-a-pure-sql-based-string-tokenizer/comment-page-1#comment-195840</link>
		<dc:creator>Patrick Wolf</dc:creator>
		<pubDate>Thu, 08 Feb 2007 11:32:35 +0000</pubDate>
		<guid isPermaLink="false">http://technology.amis.nl/blog/?p=1631#comment-195840</guid>
		<description>&lt;p&gt;
Hi Lucas,

you are keeping me away from work! But a SQL puzzle in the morning is good for my brain! :-)
Here is my alternate solution using CONNECT BY&#160;&lt;/p&gt;&lt;pre&gt;SELECT LEVEL &lt;br /&gt;,      SUBSTR ( STRING_TO_TOKENIZE &lt;br /&gt;              , DECODE( LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)&lt;br /&gt;              , INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) &lt;br /&gt;                - DECODE( LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)&lt;br /&gt;              ) &lt;br /&gt;FROM ( SELECT &#039;&amp;String_To_Tokenize&#039;&#124;&#124;&#039;&amp;Delimiter&#039; AS STRING_TO_TOKENIZE &lt;br /&gt;       ,      &#039;&amp;Delimiter&#039; AS DELIMITER &lt;br /&gt;       FROM DUAL &lt;br /&gt;     ) &lt;br /&gt;CONNECT &lt;br /&gt;BY     INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) &gt; 0 &lt;br /&gt;ORDER &lt;br /&gt;BY     LEVEL ASC ; &lt;br /&gt;&lt;/pre&gt;&lt;p&gt;


Patrick
Check out my APEX blog: &lt;a rel=&quot;nofollow&quot; href=&quot;http://inside-apex.blogspot.com/&quot; rel=&quot;nofollow&quot;&gt;http://inside-apex.blogspot.com/&lt;/a&gt;&lt;/p&gt;</description>
		<content:encoded><![CDATA[<p>
Hi Lucas,</p>
<p>you are keeping me away from work! But a SQL puzzle in the morning is good for my brain! <img src='http://technology.amis.nl/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Here is my alternate solution using CONNECT BY&nbsp;</p>
<pre>SELECT LEVEL ,      SUBSTR ( STRING_TO_TOKENIZE               , DECODE( LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)              , INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)                 - DECODE( LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)              ) FROM ( SELECT '&amp;String_To_Tokenize'||'&amp;Delimiter' AS STRING_TO_TOKENIZE        ,      '&amp;Delimiter' AS DELIMITER        FROM DUAL      ) CONNECT BY     INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) &gt; 0 ORDER BY     LEVEL ASC ; </pre>
<p>Patrick<br />
Check out my APEX blog: <a rel="nofollow" href="http://inside-apex.blogspot.com/" rel="nofollow">http://inside-apex.blogspot.com/</a></p>
]]></content:encoded>
	</item>
</channel>
</rss>

