Sql 比较名称字段和字符串值的最佳方法是什么?
我有一个查询,它将字符串值与数据库中的名称字段进行比较。数据库中名称字段的结构不一致,可能是以下任何一种:Sql 比较名称字段和字符串值的最佳方法是什么?,sql,string,postgresql,where-clause,sql-like,Sql,String,Postgresql,Where Clause,Sql Like,我有一个查询,它将字符串值与数据库中的名称字段进行比较。数据库中名称字段的结构不一致,可能是以下任何一种: John Doe Doe John Doe, John 我的字符串值可以是任何结构,但现在是这样的: Doe, John 查询: full_name ILIKE 'Doe, John%' 这并不总是返回记录。在任何结构中进行比较最可靠的查询是什么?可以使用where name in('Doe%','John%') 或 使用like with或子句as 使用其中的名称,如'Doe%'或
John Doe
Doe John
Doe, John
我的字符串值可以是任何结构,但现在是这样的:
Doe, John
查询:
full_name ILIKE 'Doe, John%'
这并不总是返回记录。在任何结构中进行比较最可靠的查询是什么?可以使用
where name in('Doe%','John%')
或
使用like with或子句as
使用
其中的名称,如'Doe%'或'John%'
请注意,通过查询,您得到的o/p非常罕见,因为只有最后一行符合like子句的整体结构,
,%%
,这并不意味着它对两个单独的单词起作用
full_name IN ('John Doe', 'Doe John', 'Doe, John')
如果您事先知道全名的所有可能变化,这是最有效的方法。在全名
列上有一个索引,这应该非常快
选项2:确保名字和姓氏都是字符串的一部分:
full_name LIKE '%John%' AND full_name LIKE '%Doe%'
这真的是效率较低。在左侧使用通配符的LIKE
基本上会破坏列全名上的索引,并生成完整的表扫描。这是:
replace(replace(trim(full_name), ' ', ', '), ',,', ',')
将全名转换为:
'John,Doe'
或'Doe,John'
即使它不包含,
。
这些:
提取模式字符串值中,
左右的内容。
所以你可以这样做:
replace(replace(trim(full_name), ' ', ', '), ',,', ',') in (
pattern,
concat(
trim(substring(pattern, strpos(pattern, ',') + 1)),
', ',
left(pattern, strpos(pattern, ',') - 1)
)
)
您可以将其拆分为多个名称,然后使用进行比较,如
。例如:
where (select bool_and('doe john' like '%' || name || '%')
from unnest(string_to_array(v.str, ' ')) name
)
bool_和()
要求所有组件都匹配
也就是说,您应该修复数据模型,以便将名字和姓氏存储在不同的列中。您也可以尝试使用此功能
full_name like any (values ('%John%', '%Doe%'))
全名('John Doe','Doe John','Doe,John')
full_name like any (values ('%John%', '%Doe%'))