我有一个查询,该查询将字符串值与数据库中的名称字段进行比较。数据库中名称字段的结构不一致,可能是以下任何一种:
John Doe
Doe John
Doe, John
我的字符串值可以是任何结构,但现在就像这样:
Doe, John
查询:
full_name ILIKE 'Doe, John%'
这并不总是返回记录。在任何结构中进行比较的最可靠查询是什么?
答案 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个单独的单词起作用