oracle,怎么写sql可以提取到特定内容

oracle,怎么写sql可以提取到特定内容?实例如下,左图content中是一串文本,从该段文本中提取“测试、其他、存在”到右侧单独列。

img

基于new bing的回答:

SELECT
    REGEXP_SUBSTR(content, '测试|其他|存在', 1, 1, 'i') AS keyword1,
    REGEXP_SUBSTR(content, '测试|其他|存在', 1, 2, 'i') AS keyword2,
    REGEXP_SUBSTR(content, '测试|其他|存在', 1, 3, 'i') AS keyword3
FROM
    test_table;

在上面的 SQL 语句中,我们通过使用 REGEXP_SUBSTR 函数从 content 列中提取符合正则表达式 '测试|其他|存在' 的子字符串,并在第四个参数中指定不区分大小写('i')。在 SELECT 子句中,我们给每一个提取出来的子字符串起了一个别名(keyword1, keyword2, keyword3),方便后续使用。

注意:如果有些行中没有这三个关键字,则对应的列会显示 NULL。

-- 插入
INSERT INTO test_table (result)
SELECT 
    REGEXP_SUBSTR(content, '测试|其他|存在', 1, 1, 'i') || ', ' || 
    REGEXP_SUBSTR(content, '测试|其他|存在', 1, 2, 'i') || ', ' || 
    REGEXP_SUBSTR(content, '测试|其他|存在', 1, 3, 'i')
FROM 
    test_table;

-- 更新
UPDATE test_table
SET result = REGEXP_SUBSTR(content, '测试|其他|存在', 1, 1, 'i') || ', ' || 
             REGEXP_SUBSTR(content, '测试|其他|存在', 1, 2, 'i') || ', ' || 
             REGEXP_SUBSTR(content, '测试|其他|存在', 1, 3, 'i');


在上述的 SQL 语句中,我们通过使用 || 操作符来连接多个字符串,生成最终的 result 列的值。其中 INSERT INTO 语句会将 result 列插入到 test_table 表中,而 UPDATE 语句会更新表中原有的 result 列。需要注意的是,在执行 UPDATE 语句时,原有的 result 列中的数据会被覆盖。

希望我的回答能够解决你的问题!

在sql语句中,可以使用正则来提取指定形式的文本内容。


select REGEXP_REPLACE('xxxx测试xx其他xxxxxx存在', 'x{2,}', ',') AS chinese_content from dual;

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
可以使用 Oracle 中的正则表达式函数 REGEXP_SUBSTR 来提取文本中的特定内容。假设您的数据表名为 table_name,content 列中存储了需要提取内容的文本,那么可以通过以下 SQL 语句来实现:

SELECT REGEXP_SUBSTR(content, '测试|其他|存在') AS extracted_content
FROM table_name;

在上述 SQL 语句中,REGEXP_SUBSTR 函数的第一个参数是需要提取内容的文本,第二个参数是一个正则表达式,用于匹配需要提取的内容。在这个例子中,正则表达式为 '测试|其他|存在',表示需要匹配的内容为“测试”、“其他”或“存在”,多个匹配项之间使用竖线符号 "|" 分隔。

执行以上 SQL 语句后,将会返回一个包含提取内容的新列 extracted_content。如果您需要将提取的内容保存到一个新表中,可以使用以下 SQL 语句:

CREATE TABLE new_table_name AS
SELECT REGEXP_SUBSTR(content, '测试|其他|存在') AS extracted_content
FROM table_name;

其中,new_table_name 是创建的新表名,SELECT 语句中的内容与前面的 SQL 语句相同。执行以上 SQL 语句后,将会创建一个新表并将提取的内容保存到其中。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
可以使用Oracle的正则表达式函数来提取特定的内容。以下是一个示例 SQL 查询,使用 REGEXP_SUBSTR 函数从 Content 列中提取出符合要求的字符串:

SELECT 
   content, 
   REGEXP_SUBSTR(content, '测试|其他|存在') AS extracted 
FROM 
   your_table_name;

解析:

  1. 选择 Content 列和使用正则表达式函数提取的内容(使用 AS 子句对提取的内容进行重命名)。

  2. 指定要从 Content 列中搜索的模式。在这个例子中,使用竖线 (|) 分隔符将需要匹配的模式连接起来。如果需要添加更多模式,可以在竖线分隔符后面继续添加。

需要注意的是,这个函数默认只返回首次匹配的字符串,如果需要返回所有匹配的内容,可以在函数结尾处添加第四个参数,设置为零即可:

SELECT 
   content, 
   REGEXP_SUBSTR(content, '测试|其他|存在', 1, 1, 'i', 0) AS extracted 
FROM 
   your_table_name;

在上面的例子中,第三个参数指定从字符串中搜索的起始位置,第四个参数设置为零,则返回所有匹配的字符串。
如果我的回答解决了您的问题,请采纳!

是只有几个固定得值,还是随机
可以直接用模糊查询获取

引用chatGPT作答,假设你有一个包含文本内容的表,名为“text_content”,其中有一列名为“content”,那么可以使用以下 SQL 语句从文本中提取“测试”、“其他”和“存在”:

SELECT 
    content, 
    REGEXP_SUBSTR(content, '测试|其他|存在') AS keywords 
FROM 
    text_content;

这个语句使用了 Oracle SQL 内置的 REGEXP_SUBSTR() 函数,它允许你在文本中使用正则表达式进行匹配,并返回匹配到的结果。在这里,我们使用了 | 来匹配多个关键字,表示只要文本中包含“测试”、“其他”或“存在”中的任意一个,都会被提取出来。

这个语句将返回一个结果集,其中每一行包含原始文本内容以及从中提取出的关键字。你可以根据需要进一步筛选或处理这些结果。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: Oracle进阶学习:SQL语句执行过程及解析类型!中的 一、Oracle数据库的体系结构 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

     

    Oracle 体系结构简要如下图

     

    EM(Enterprise Manager)是Oracle实际的基于Java的管理工具,可通过浏览器访问数据库的管理界面,SQL PLUS可以访问数据库的数据信息。

  • 以下回答来自chatgpt:

    我可以解决这个问题。

    根据提供的文本内容,可以使用Oracle中的正则表达式函数REGEXP_SUBSTR来提取特定的关键词。下面是相关的SQL指令:

    WITH test_data AS ( SELECT '这是一条测试数据,里面存在测试和其他的关键词' AS content FROM dual ) SELECT REGEXP_SUBSTR(content, '测试|其他|存在', 1, level, 'i') AS keywords FROM test_data CONNECT BY REGEXP_SUBSTR(content, '测试|其他|存在', 1, level, 'i') IS NOT NULL;

    解释一下上面的SQL指令:

    首先通过WITH语句定义了一个名为test_data的子查询,其中的content列是需要提取关键词的文本内容。

    然后在SELECT语句中,使用REGEXP_SUBSTR函数来进行关键词的提取。REGEXP_SUBSTR函数第一个参数是需要进行正则处理的字符串,这里使用了test_data中的content列。第二个参数是进行匹配的正则表达式,这里使用了竖线(|)来同时匹配三个关键词。第三个参数是起始位置,默认为1。第四个参数是标识第几个匹配组,默认为1。第五个参数是模式,'i'表示不区分大小写进行检索。

    最后使用CONNECT BY可以使查询结果按照匹配的关键词进行垂直展示。

    执行上面的SQL指令后,会得到如下结果:

    KEYWORDS
    测试
    其他
    存在

    注意:实际使用中请自行调整涉及到的表名、列名和文本内容。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^