比较名称字段和字符串值的最佳方法是什么?

时间:2019-02-09 20:47:33

标签: sql postgresql sql-like

我有一个查询,该查询将字符串值与数据库中的名称字段进行比较。数据库中名称字段的结构不一致,可能是以下任何一种:

John Doe
Doe John
Doe, John

我的字符串值可以是任何结构,但现在就像这样:

Doe, John

查询:

full_name ILIKE 'Doe, John%'

这并不总是返回记录。在任何结构中进行比较的最可靠查询是什么?

5 个答案:

答案 0 :(得分:2)

选项1 -由melpomene评论:IN条件

full_name IN ('John Doe', 'Doe John', 'Doe, John')

如果您事先知道全名的所有可能变体,则这是最有效的方法。在列full_name上有索引,应该很快。

选项2 :确保名字和姓氏都是字符串的一部分:

full_name LIKE '%John%' AND full_name LIKE '%Doe%'

这实际上效率较低。将LIKE与左侧的通配符一起使用,基本上会打败full_name列上的索引,并生成全表扫描。

答案 1 :(得分:0)

此:

replace(replace(trim(full_name), ' ', ', '), ',,', ',')

会将全名转换为:

'John, Doe''Doe, John' 即使其中不包含,。 这些:

left(pattern, strpos(pattern, ',') - 1)
trim(substring(pattern, strpos(pattern, ',') + 1))

提取模式字符串值中,左右的内容。 因此,您可以这样做:

replace(replace(trim(full_name), ' ', ', '), ',,', ',') in ( 
  pattern,
  concat(
    trim(substring(pattern, strpos(pattern, ',') + 1)),
    ', ',
    left(pattern, strpos(pattern, ',') - 1)
  )
)

答案 2 :(得分:0)

您可以将其拆分为名称,然后使用like进行比较。例如:

where (select bool_and('doe john' like '%' || name || '%')
        from unnest(string_to_array(v.str, ' ')) name
       )

bool_and()要求所有组件都匹配。

也就是说,您应该修复数据模型,以便将名字和姓氏存储在不同的列中。

答案 3 :(得分:0)

您也可以尝试

full_name like any (values ('%John%', '%Doe%'))

答案 4 :(得分:-1)

使用BufferedImage grayImg = ImageIO.read(new File(path)); BufferedImage colorImage = new BufferedImage(grayImg .getWidth(), grayImg .getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D graphics = colorImage.createGraphics(); graphics.drawImage(grayImg ,0,0,null); graphics.dispose(); grayImg.flush(); ImageIO.write(colorImage ,"jpg", newPath); colorImage .flush();

与OR CLAUSE一起使用

使用where name in ('Doe%', 'John%')

请注意,您的查询中的o / p很少见,因为在您的like子句中只有最后一行符合where name like 'Doe%' OR 'John%'的整个结构,这并不意味着它会针对2个单独的单词起作用