我有一个具有全名字段的大型数据库。全名可以是任何格式,也可以包括标题。例如,以下所有条件都是可能的:
John Smith
Smith, John
Mr. John Smith
Dr. John Smith
Mrs. Jane Smith
Ms. Jane Smith
Jane Smith, Esq.
Jane Smith, MD
我想保留全名字段,但还要从单独的表(包含姓名,性别)中添加预测的名字字段。
我认为,正确的逻辑是通过LIKE将名字值+空格匹配到全名表。该空格使“ David Johnson”与“ John”不匹配。
我认为完成此操作的方法是在其中添加一个子查询的update语句。这是我到目前为止的内容:
UPDATE "employees"
SET "employees".FirstName = (SELECT firstname
FROM genders
WHERE fullname LIKE '%"employees".FirstName %')
答案 0 :(得分:3)
您真正想做的是使用Postgres的全文搜索功能。您可以创建一个停用词列表,其中包含要排除的标题(先生,女士等)。然后,设置搜索配置以使用停用词。
正确设置了搜索配置后,查询将类似于以下内容(这是SELECT
的变体:更改为UPDATE
很简单)
SELECT employees.full_name, genders.first_name
FROM employees
LEFT JOIN genders ON
TO_TSVECTOR('english_titles', employees.full_name)
@@ TO_TSQUERY('english_titles', genders.first_name)
这将为您提供以下结果:
full_name first_name
"John Smith" "John"
"Smith, John" "John"
"Mr. John Smith" "John"
"Dr. John Smith" "John"
"Mrs. Jane Smith" "Jane"
"Ms. Jane Smith" "Jane"
"Jane Smith, Esq." "Jane"
"Jane Smith, MD" "Jane"
"David Johnson" NULL
要使其正常工作,您需要执行以下步骤:
$SHAREDIR/tsearch_data
Postgres目录中。参见https://www.postgresql.org/docs/9.1/static/textsearch-dictionaries.html#TEXTSEARCH-STOPWORDS。pg_catalog.simple
用作模板字典)。参见https://www.postgresql.org/docs/9.1/static/textsearch-dictionaries.html#TEXTSEARCH-SIMPLE-DICTIONARY。现在,尽管如此,您需要仔细考虑以下几点:
Genders
表中的名字匹配的人?例如,您有一个叫John Stuart
的人,并且John
和Stuart
都在您的genders
表中。您希望如何处理?genders
的表?您是否希望按性别匹配人们的名字?如果是这样,那是一条走下去的危险之路-有些名字可以用于任何性别。