web-dev-qa-db-de.com

prüfen Sie, ob Clob String oracle enthält

zur Zeit habe ich eine Abfrage mit diesem Code to_char(CLOB_COLUM) like %s, aber das folgende funktioniert nicht für sehr große Clob. Gibt es eine andere Lösung, um zu überprüfen, ob diese Spalte eine Zeichenfolge enthält? Verwenden von Oracle 11.2.0.4.0

7
Master Yi

Sie können DBMS_LOB.INSTR( clob_value, pattern [, offset [, occurrence]] ) verwenden:

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

oder

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

Basis ist die Antwort von MT0. Ich teste, welcher Weg effizient ist.

Die Länge der CLOB-Spalte ist 155018 und sucht nach der Länge von 32

Hier ist mein Test.

| 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  |

 enter image description here

Die durchschnittliche Zeit von INSTR beträgt 0,797.

Die durchschnittliche Zeit von WIE beträgt 0,823.

2
alan9uo

Wenn Sie den Wert der Spalte anzeigen möchten und Oracle ORA-22835 (Puffer zu klein) für WHERE clob_column LIKE '%string to match%' zurückgibt, sollten Sie eine Problemumgehung anwenden.

Die Kombination von DBMS_LOB.instr und DBMS_LOB.substr könnte eine Lösung sein. Siehe z. dieser Stackoverflow-Tipp . Also in Ihrem Fall:

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 
0
Srdjan