【问题标题】:check if clob contains string oracle检查 clob 是否包含字符串 oracle
【发布时间】:2017-10-16 22:16:03
【问题描述】:

目前我有此代码to_char(CLOB_COLUM) like %s 的查询,但以下不适用于非常大的 clob。是否有另一种解决方案来检查此列是否包含某些字符串。使用 oracle 11.2.0.4.0

【问题讨论】:

    标签: sql oracle clob


    【解决方案1】:

    你可以使用DBMS_LOB.INSTR( clob_value, pattern [, offset [, occurrence]] ):

    SELECT *
    FROM   your_table
    WHERE  DBMS_LOB.INSTR( clob_column, 'string to match' ) > 0;
    

    SELECT *
    FROM   your_table
    WHERE  clob_column LIKE '%string to match%';
    

    【讨论】:

    • 第一个工作,第二个不工作过去也尝试过这种方法,不知道为什么,但我认为第二个看起来只像 to_char 前 4000 个字符
    • 你能告诉我如何搜索一个在 clob 中不存在的字符串吗?
    • @user3384231 请阅读答案中链接的DBMS_LOB.INSTR() 的文档。如果找不到模式,它会告诉您返回值,您可以将其用作过滤器,而不是 > 0 用于找到模式的时间。
    • @MT0:谢谢。当为=0时,搜索pattern not found。
    【解决方案2】:

    基于 MT0 的回答。我测试哪种方式有效。

    CLOB Column 长度为 155018 并搜索 32 长度 字符串。

    这是我的测试。

    | INSTR  | LIKE  |
    |:-------|------:|
    | 0.857  |0.539  |
    | 0.127  |0.179  |
    | 1.635  |0.534  |
    | 0.511  |0.818  |
    | 0.429  |1.038  |
    | 1.586  |0.772  |
    | 0.461  |0.172  |
    | 0.126  |1.379  |
    | 1.068  |1.088  |
    | 1.637  |1.169  |
    | 0.5    |0.443  |
    | 0.674  |0.432  |
    | 1.201  |0.135  |
    | 0.419  |2.057  |
    | 0.731  |0.462  |
    | 0.787  |1.956  |
    

    INSTR平均耗时0.797。

    LIKE的平均时间为0.823。

    【讨论】:

      【解决方案3】:

      如果您想查看列的值并且 Oracle 针对 WHERE clob_column LIKE '%string to match%' 返回了 ORA-22835(缓冲区太小),那么您应该应用一些变通方法。

      DBMS_LOB.instrDBMS_LOB.substr 的组合可能是一个解决方案。参见例如this Stackoverflow tip。所以,在你的情况下:

      SELECT DBMS_LOB.substr(your_clob_column, DBMS_LOB.instr(your_clob_column,'string to match'), 1) AS Text
      FROM your_table
      WHERE DBMS_LOB.instr(your_clob_column, 'string to match') > 0 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-09
        • 2013-05-18
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 2013-10-26
        • 1970-01-01
        • 2013-11-20
        相关资源
        最近更新 更多