0

我有一个带有撇号的电子邮件地址的数据库表,例如“some.o'ne@somewhere.com”。

我想:

  1. 查询此表,并检查此电子邮件地址是否存在
  2. 如果表格中不存在此电子邮件地址,请插入该地址

我试过了:

SELECT * 
FROM EMAILTABLE 
WHERE emailaddress LIKE 'some.o''ne@somewhere.com'

它没有找到"some.o'ne@somewhere.com",所以它把它当作它不存在来对待!

4

2 回答 2

0

某些文本周围的双引号表示您正在查找对象名称,除非您将双引号嵌入到单引号中。

所以:

DROP TABLE IF EXISTS emailtable;

CREATE TEMP TABLE emailtable (emailaddress text);

CREATE UNIQUE INDEX idx_emailtable_emailaddress ON emailtable (emailaddress);

INSERT INTO emailtable (emailaddress) VALUES ('some.o''ne@somewhere.com'); 

SELECT emailaddress
,(emailaddress = 'some.o''ne@somewhere.com')::bool as escaped_apostrophe_single_quotes --true because it matches the value in the table
--,(emailaddress = "some.o'ne@somewhere.com")::bool as double_quotes --ERROR: column "some.o'ne@somewhere.com" does not exist
,(emailaddress = '"some.o''ne@somewhere.com"')::bool as double_quotes --false because the value in the table doesn't include double-quotes
FROM emailtable;

在第二个测试中,假设“some.o'ne@somewhere.com”是一列,因为它是双引号内的名称。

您可以从第一个和第三个测试中看到,字符串中存在双引号表示这些字符串是不同的。第一个与表中的值相同。另一个不是。

无论如何,我认为最简单的处理方法是在电子邮件地址上使用唯一索引。如果您随后尝试插入已经存在的相同值,它不会做任何事情。

INSERT INTO emailtable (emailaddress) VALUES ('some.o''ne@somewhere.com') ON CONFLICT DO NOTHING;

在此处输入图像描述

于 2022-01-21T20:08:38.660 回答
0

感谢您的回复(仅用两个单引号替换单引号对我不起作用,因为它用两个单引号存储电子邮件地址)这个查询对我来说很好:

SELECT * FROM EMAILTABLE WHERE emailaddress = (E'some.o\'ne@somewhere.com')::text;
于 2022-01-24T11:49:35.600 回答