Postgres字符(50)与'some string'

时间:2016-09-29 18:38:12

标签: sql postgresql

有些人可以向我解释为什么postgresql中的这种比较不按照我想要的方式工作吗?

所以我有一个名为customer的数据库,它有customerid,firstname,lastname,phone和city列。这些列中的每一列都是一个Character(50)。我想找到来自某个城市的客户,并试图找出如何选择某个城市的多个查询...我觉得这将是一个简单的答案,但我对sql查询很新。

我运行的第一个查询是

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

这个查询没有返回任何结果,我也尝试了LIKE,ILIKE似乎没什么工作我甚至将它从字符(50)更改为字符变化但仍然没有结果..不确定我在这里做错了什么

2 个答案:

答案 0 :(得分:1)

因为character将所有值填充到定义的长度。因此'Denver'存储为'Denver '

Quote from the manual

  

字符类型的值用空格填充到指定的宽度n,并以这种方式存储和显示

这是SQL标准定义此数据类型的方式。这是一个古老的遗留下来。

简而言之:从不使用character。使用varchar总是更好(基本上每个SQL数据库都是如此 - 对于Postgres来说更是如此)。

答案 1 :(得分:1)

您可以使用与此类似的查询自行回答:

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

您正在寻找价值'丹佛'所以我可以想到三个场景:

  1. CHAR(50)每次都有50个字符。搜索只有六个字符的字符串将正确生成没有记录。我建议你定义VARCHAR或VARCHAR(50)。 CHAR对于诸如2个字母的州缩写之类的固定长度令牌更有用。但你尝试了一个LIKE查询......
  2. 通配符是否使其成为LIKE / ILIKE查询?适当地,它看起来像这样: SELECT * FROM customer WHERE city LIKE 'D%';
  3. 您没有提及您的城市专栏是否具有案例敏感性。如果是,那么' DENVER'不同于丹佛'。既然你也尝试过ILIKE查询......
  4. 也许显而易见的第一步,以及我建议上面的查询的原因是检查该值是否实际进入表中。
  5. 感觉像(2)或(4)一样。