1

我正在使用的数据库有两个我感兴趣的特定列(在大约 130 多个其他列中)。第一列存储了许多不同的参数名称(对于每一行),由竖线 ( | ) 分隔,以下列存储由竖线分隔的每个参数的值。所以它就像 -

----------------------------------------------------------------------------------------------
Column 1                                       <|||>           Column 2
----------------------------------------------------------------------------------------------
par1 | par2 | par3 | par 4| par 5              <|||>  val1 | val2| val3| val4| val5
------

现在,我只对特定参数及其对应的值感兴趣(例如,我只需要 par4 及其值 val4 )。最有效的方法是什么?ADD:我正在使用 ASP.NET(+ C#),我需要将结果绘制到我的页面中。这就是为什么我对单个参数及其对应值特别感兴趣的原因。

PS:版主,我真的没有在某个地方找到答案,所以我决定改为发布。如果答案已经在某处,请关闭线程并引导我找到解决方案,我不打算发送垃圾邮件。谢谢。编辑:我无法为“垂直条”创建标签(说我至少需要 1500 个代表)。如果版主觉得这篇文章需要这个标签,那么请做必要的事情。

4

1 回答 1

1

Oracle 没有内置的字符串标记器,但有多种方法可以分割定界字符串。这个使用正则表达式和 CONNECT BY 子句。

with col1 as (
        select level as token_no
               , regexp_substr(col1, '[^\|]+', 1, level) as token
        from   t42
        connect by level <= regexp_count(col1, '\|') + 1 
        )
    , col2 as (
         select level as token_no
                , regexp_substr(col2, '[^\|]+', 1, level) as token
         from   t42
         connect by level <= regexp_count(col2, '\|') + 1 
        )
select col1.token as par
       , col2.token as val
from col1 
     join col2
         on col1.token_no = col2.token_no
where col1.token_no = 4
/

这是 [不可避免的 SQL Fiddle][1]。

注意:为了清楚起见,我在此示例中使用了 CTE。在现实生活中,你可能想把它变成一个函数。


在现实生活中,像这样将数组存储在连接字符串中是一种不好的做法。这也是一个常见的,唉。

于 2014-07-08T02:52:10.237 回答