我有一个带有撇号的电子邮件地址的数据库表,例如“some.o'ne@somewhere.com”。
我想:
- 查询此表,并检查此电子邮件地址是否存在
- 如果表格中不存在此电子邮件地址,请插入该地址
我试过了:
SELECT *
FROM EMAILTABLE
WHERE emailaddress LIKE 'some.o''ne@somewhere.com'
它没有找到"some.o'ne@somewhere.com"
,所以它把它当作它不存在来对待!
我有一个带有撇号的电子邮件地址的数据库表,例如“some.o'ne@somewhere.com”。
我想:
我试过了:
SELECT *
FROM EMAILTABLE
WHERE emailaddress LIKE 'some.o''ne@somewhere.com'
它没有找到"some.o'ne@somewhere.com"
,所以它把它当作它不存在来对待!
某些文本周围的双引号表示您正在查找对象名称,除非您将双引号嵌入到单引号中。
所以:
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;
感谢您的回复(仅用两个单引号替换单引号对我不起作用,因为它用两个单引号存储电子邮件地址)这个查询对我来说很好:
SELECT * FROM EMAILTABLE WHERE emailaddress = (E'some.o\'ne@somewhere.com')::text;