【问题标题】:PostgreSQL query for emails with ApostrophePostgreSQL 使用撇号查询电子邮件
【发布时间】:2022-01-21 19:41:26
【问题描述】:

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

我想:

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

我试过了:

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

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

【问题讨论】:

  • 嗯,some.o''ne@somewhere.com"some.o'ne@somewhere.com" 不同。如果您的列包含双引号,显然您需要将它们包含在比较值中。另外:LIKE 在这里没有任何意义,因为您没有使用任何通配符,所以它与 = 相同
  • 我刚刚使用 dbeaver-ce 作为客户端在 postgres 数据库中测试了您的示例。它工作得很好。如果遇到问题,请尝试使用 \' 而不是 ' 来转义单引号
  • Works for me. 正如其他人已经评论的那样,双引号是数据的一部分,还是您在文本中使用它们来逐字分隔值?
  • 数据库包含单引号,无法更改数据库。当双引号查询数据库时,它没有找到带有单引号的电子邮件地址!我也尝试使用 \' 但它失败了!

标签: sql postgresql sql-like string-constant


【解决方案1】:

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

所以:

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;

【讨论】:

    【解决方案2】:

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

    SELECT * FROM EMAILTABLE WHERE emailaddress = (E'some.o\'ne@somewhere.com')::text;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2013-04-10
      • 1970-01-01
      • 2021-10-14
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多