【发布时间】:2014-01-14 01:06:31
【问题描述】:
我有一个包含书名的表格,我想选择书名与正则表达式匹配的书,并按正则表达式在标题中匹配的位置对结果进行排序。
单字搜索很容易。例如
TABLE book
id title
1 The Sun
2 The Dead Sun
3 Sun Kissed
在将查询发送到数据库之前,我将在客户搜索词中的单词之间放置.*,因此我将在此处使用准备好的正则表达式编写 SQL。
SELECT book.id, book.title FROM book
WHERE book.title ~* '.*sun.*'
ORDER BY COALESCE(NULLIF(position('sun' in book.title), 0), 999999) ASC;
RESULT
id title
3 Sun Kissed
1 The Sun
2 The Dead Sun
但是,如果搜索词有多个词,我想匹配包含搜索词中所有词的标题以及它们之间的任何内容,并像以前一样按位置排序,所以我需要一个返回正则表达式位置的函数,我在官方 PostgreSQL 文档中没有找到合适的。
TABLE books
id title
4 Deep Space Endeavor
5 Star Trek: Deep Space Nine: The Never Ending Sacrifice
6 Deep Black: Space Espionage and National Security
SELECT book.id, book.title FROM book
WHERE book.title ~* '.*deep.*space.*'
ORDER BY ???REGEXP_POSITION_FUNCTION???('.*deep.*space.*' in book.title);
DESIRED RESULT
id title
4 Deep Space Endeavor
6 Deep Black: Space Espionage and National Security
5 Star Trek: Deep Space Nine: The Never Ending Sacrifice
没有找到类似???REGEXP_POSITION_FUNCTION???的函数,大家有什么想法吗?
【问题讨论】:
-
为什么最后一个结果中的第 4 行在第 6 行之前?两者都在位置 0 匹配。任意?还是有更多标准?
-
@ErwinBrandstetter 理想情况下,我希望更长(更多字符)匹配的“排名”更少,但目前这不是主要问题。
标签: sql regex database postgresql