将Postgres中的字符(50)与“某个字符串”进行比较

3

请问有人能解释一下为什么我的postgresql比较不按照我想要的方式运行吗?

我有一个名为customer的数据库,它有customerid、firstname、lastname、phone和city等列。每一列都是Character(50)类型的。我想找到特定城市的客户,并运行了多个查询尝试选择某个城市。我感觉这将是一个简单的答案,但我对SQL查询还很陌生。

我运行的第一个查询如下:

SELECT * 
FROM customer c 
WHERE c.city = 'Denver'

这个查询没有返回任何结果,我也尝试了LIKE、ILIKE,但都无法正常工作。我甚至将它从character(50)更改为character varying,但仍然没有结果...不确定我在这里做错了什么。


如果要存储的字符串比声明的长度短,则字符类型的值将用空格填充[...]。您选择这种特定类型的原因是什么? - Vincent Savard
2个回答

2
由于character将所有值都填充到定义的长度,所以'Denver'被存储为'Denver '手册中的引用 引用如下:
字符类型的值在物理上填充了空格到指定的宽度n,并以这种方式存储和显示。
这就是SQL标准定义的数据类型。它是一个古老的遗留问题。
简而言之:永远不要使用character。最好使用varchar(对于基本上每个SQL数据库都是如此-尤其是对于Postgres而言)。

1

您可以通过类似以下查询来自行解决:

SELECT FORMAT('''%s''',city) FROM customer WHERE city ILIKE 'D%';

您正在寻找值“Denver”,因此我可以想到三种情况:

  1. CHAR(50)始终有50个字符。 您的字符串搜索只有六个字符,因此不会产生任何记录。 我建议您使用VARCHAR或VARCHAR(50)进行定义。 CHAR对于固定长度的标记(如两个字母的州缩写)更有用。 但是,您尝试了LIKE查询,因此...
  2. 通配符字符是否已经包含在LIKE/ILIKE查询中? 正确的格式看起来像这样:SELECT * FROM customer WHERE city LIKE 'D%';
  3. 您没有提及城市列是否区分大小写。 如果是,则'DENVER'与'Denver'不同。 而且,由于您还尝试了一个ILIKE查询...
  4. 也许显而易见的第一步,也是我建议上面的查询的原因,是检查该值是否实际输入表格。

感觉(2)或(4)是问题所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接