Postgresql

LIKE 搜尋 bytea 數據類型 (PostgreSQL)

  • April 22, 2021

桌子:

\d blob

Column  |       Type   | Collation |                 Default                  
---------+--------------+-----------+------------------------------------------
id      | integer      |           | nextval('modlink_blob_id_seq'::regclass)
content | bytea        |           | 

這個說法:

SELECT COUNT(*) "job" INNER JOIN "blob" ON ("job"."input_id" = "blob"."id")
 WHERE UPPER("blob"."content"::text) LIKE UPPER('%csv%');

錯誤資訊:

ERROR:  invalid memory alloc request size 1989028364

我該怎麼做才能使這個聲明不失敗?

也許你可以使用位置函式https://www.postgresql.org/docs/13/functions-binarystring.html

WHERE position('csv'::bytea in "blob"."content") > 0

我發現在具有大量內容的列中在 PostgreSQL 中進行“LIKE”搜尋的最佳方法是使用 tsvector 列。

一個優點是比進行“喜歡”搜尋更快並允許創建索引。

無聊的部分是創建一個觸發器來複製新列中的內容。

下面的文章展示瞭如何使用 tsvector。

http://rachbelaid.com/postgres-full-text-search-is-good-enough/

Column  |       Type   | Collation |                 Default                  
---------+--------------+-----------+------------------------------------------
id      | integer      |           | nextval('modlink_blob_id_seq'::regclass)
content | bytea        |           |
search  | tsvector     |           | 

這是 SQL

SELECT COUNT(*) FROM "job" INNER JOIN "blob" ON ("job"."input_id" = "blob"."id") 
WHERE blob.search @@ plainto_tsquery('csv');

觀察:我使用text列代替bytea

引用自:https://dba.stackexchange.com/questions/220130