【问题标题】:Why does my postgresql SELECT statement return 0 rows?为什么我的 postgresql SELECT 语句返回 0 行?
【发布时间】:2016-05-13 19:05:22
【问题描述】:

也许我遗漏了一些非常明显的东西,但我试图从一个表中选择一个名为“电子邮件”的列,其类型为字符 (50)。

我设置了一个简单的测试,我可以成功查询除此之外的所有其他列。现在,'name' 和 'password' 列也是 character(50) 类型;

我正在复制并粘贴示例电子邮件“johnsmith@gmail.com”,与数据库中列出的完全相同,我确信没有多余的空格。

这是我的名为“用户”的表:

id | name |        email        | password
---------------------------------------------
10 | john | johnsmith@gmail.com | adsfpokasdf

我的查询是:

SELECT name FROM users WHERE email = 'johnsmith@gmail.com';

我选择的列类型有问题吗?

这是一张图片: Why is this postgresql SELECT statement returning 0 rows?

【问题讨论】:

  • 您的电子邮件中可能有前导空格或尾随空格? select email from users 返回什么?
  • 另一种测试the suggested的方法是使用trim()函数:WHERE trim(email) = 'johnsmith@gmail.com'

标签: postgresql select


【解决方案1】:

也许我遗漏了一些非常明显的东西,但我试图从一个表中选择一个名为“电子邮件”的列,其类型为字符 (50)。

这是你的问题。您需要character varying 类型(也称为varchartext 类型也可以正常工作,无需进行长度检查)。 character(50) 只会保存长度为 50 的字符串,并会用空格填充它。

重新创建列类型为varchar(50)text 的表,然后重试。它应该更接近预期。

【讨论】:

    【解决方案2】:

    我不得不从

    更改我的 where 子句
    SELECT "fieldId" FROM MyTable WHERE 'fieldId' = 'stringid'
    

    SELECT "fieldId" FROM MyTable WHERE "fieldId" = 'stringid'
    

    基本上将where子句中的单引号加倍。我不知道为什么我必须引用它,但在某些 postgres 实例中我不得不这样做。

    希望这对其他人有帮助:)

    【讨论】:

    【解决方案3】:

    也许 '@' 用于 PostgreSQL 中的模式匹配?如果是这样,它可能需要在它之前的转义字符...

    试一试:

    SELECT name FROM users WHERE email = 'johnsmith\@gmail.com';
    

    也试试(来自THIS 帖子):

    SELECT name FROM users WHERE email = E'johnsmith@gmail.com';
    

    最后:

    SELECT name FROM users WHERE email = E'johnsmith\@gmail.com';
    

    【讨论】:

    • 好主意 - 我试了一下,它仍然没有用。我删除了原始行,使用相同的信息再次创建它,当我再次查询它时它工作了。一定有一些我没有看到的性格差异。非常感谢您的快速回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2016-08-13
    • 2011-10-26
    • 1970-01-01
    • 2011-09-06
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多