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%'))