我的一个同事在处理COBOL程序时遇到了此问题,并最终在应用程序级别解决了该问题。我仍然很好奇,是否有可能使用SQL在数据访问级别上解决它。这在某种程度上与另一个问题有关,但是我只想使用ANSI SQL。
我正在寻找一个对包含可变长度CSV行的VARCHAR字段起作用的SQL选择查询。该查询的目的是在其自己的结果集行中拆分每个CSV字段。
这是一个带有模式和数据的示例
CREATE TABLE table1 (`field` varchar(100)); INSERT INTO table1 (`field`) VALUES ('Hello,world,!') , ('Haloa,!') , ('Have,a,nice,day,!');
这是我想从查询中获得的输出:
Hello world ! Haloa ! Have a nice day !
所使用的CSV分隔符是逗号,现在我不必担心转义。
据我所知,这是ANSI SQL:
with recursive word_list (field, word, rest, field_id, level) as ( select field, substring(field from 1 for position(',' in field) - 1) as word, substring(field from position(',' in field) + 1) as rest, row_number() over () as field_id, 1 from table1 union all select c.field, case when position(',' in p.rest) = 0 then p.rest else substring(p.rest from 1 for position(',' in p.rest) - 1) end as word, case when position(',' in p.rest) = 0 then null else substring(p.rest from position(',' in p.rest) + 1) end as rest, p.field_id, p.level + 1 from table1 as c join word_list p on c.field = p.field and position(',' in p.rest) >= 0 ) select word from word_list order by field_id, level;
这假定infield中的值是唯一的。
field