在两个已知字符串元素之间选择SQL字段的PART

时间:2014-01-30 08:26:37

标签: sql

我希望从SQL表中的注释字段中仅提取字符串的一部分。当前字符串如下所示:“ TN:mba trucking | HR:cf82267 | TR:solomon | AI:| N / A ”。我想要做的是从TN中选择任何东西:直到下一个管道。然后我想从HR中选择任何东西:直到下一个管道。注意,这些参数之间的数据并不总是相同的长度,因此不能使用SUBSTRING

2 个答案:

答案 0 :(得分:0)

例如:

我写了这段代码来获取字符串中的数字列表

SELECT DISTINCT A.REZ FROM
(
    SELECT REGEXP_SUBSTR('1213-1201+1202+1203+1204+1205+1206+1207+1208+1209+1210+1211', '[0-9]+', 1, LEVEL) AS REZ FROM dual
    CONNECT BY REGEXP_SUBSTR('1213-1201+1202+1203+1204+1205+1206+1207+1208+1209+1210+1211', '[0-9]+', 1, LEVEL) IS NOT NULL
) A;

你可以编写正则表达式来获取每个管道之间的单词

所以,它会是这样的:

SELECT A.REZ FROM
(
    SELECT REGEXP_SUBSTR(Your_Var, Your_Regular_Expression, 1, LEVEL) AS REZ FROM dual
    CONNECT BY REGEXP_SUBSTR(Your_Var, Your_Regular_Expression, 1, LEVEL) IS NOT NULL
) A;

Your_Var将保留您要使用的文字

Your_Regular_Expression将是您需要构建以满足您需求的正则表达式

注意:这是Oracle Sql语法

答案 1 :(得分:0)

对于Oracle,您可以使用instrsubstr,根据不同的stringlength灵活使用。在我的例子中,我没有创建一个表格,我可以从中选择你的样本字符串。因此它有点笨重。如果你可以使用普通的字段名而不是重复字符串,它将看起来更紧凑。

SELECT SUBSTR('TN:mba trucking|HR:cf82267|TR:solomon|AI:|N/A',
          INSTR('TN:mba trucking|HR:cf82267|TR:solomon|AI:|N/A', 'TN:'),
          INSTR('TN:mba trucking|HR:cf82267|TR:solomon|AI:|N/A', '|') - 1)
  FROM dual;

我包含 -1 以关闭管道。如果你愿意,你也可以关掉 TN:。这是一种非常基本的方式,而不是最佳解决方案。如果文本包含instr-function中要查找的一些关键字,则会出现问题。根据整体情况,使用一些正则表达式可能是明智的,比如之前提到过的simsim。