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