【问题标题】:formating a phone number in the postresql query在 postgresql 查询中格式化电话号码
【发布时间】:2013-10-28 19:15:45
【问题描述】:

你能在 postgreSQL 查询中格式化电话号码吗?我有一个电话号码列。电话号码是这样保存的:1234567890。我想知道postgres是否会格式化为(123)456-7890。我可以在查询之外执行此操作,我使用的是 php,但如果我能够获得像 (123) 456-7890 这样的查询输出,那就太好了

【问题讨论】:

  • 所以,它存储为数字,而不是字符串,对吗?
  • 嗯,电话号码实际上并不是数字,它们实际上是恰好由数字字符组成的字符串。首先修复您的架构。您必须处理国际号码还是只处理北美号码?扩展呢?
  • 只是一个简短的评论,我建议您通过 Web 界面使用 JQuery 或 Javascrip 强制执行正确的格式,然后将该字符串直接存储到数据库中。我知道这不能回答你的问题,但它绝对是更好的设计,我会说:)

标签: sql postgresql


【解决方案1】:

这对你有用:

SELECT
  '( ' || SUBSTRING(CAST(NUMBER AS VARCHAR) FROM 1 FOR 3) || ' ) ' 
 || SUBSTRING(CAST(NUMBER AS VARCHAR) FROM 4 FOR 3) || '-' 
 || SUBSTRING(CAST(NUMBER AS VARCHAR) FROM 7 FOR LENGTH(CAST(NUMBER AS VARCHAR)))
FROM
  YOURTABLE

另外,这是一个SQLFiddle

【讨论】:

  • @Kyzer 如果您找到了答案,请不要忘记点赞/标记为正确答案,以便其他人轻松找到。
【解决方案2】:

使用正则表达式,它更灵活且易于阅读。假设数字在“电话”字段中:

SELECT regexp_replace(phone, '(\d{3})(\d{3})(\d{4})', '(\1) \2-\3') phone FROM table;

您还可以通过多种方式对其进行修饰:为国家/地区代码添加可选数字、允许多个数字或更多。

例如,首先去除非数字和固定的半格式值,如 (123) 4567890:

SELECT regexp_replace(regexp_replace(phone, '\D', '', 'g'), '(\d{3})(\d{3})(\d{4})', '(\1) \2-\3') phone FROM table;

【讨论】:

  • 这就是我要找的。谢谢。
【解决方案3】:

使用SUBSTRING函数

类似:

  SELECT 
 '(' || SUBSTRING((PhoneNumber, 1, 3) + ') ' || SUBSTRING(PhoneNumber, 4,3) || '-' || SUBSTRING((PhoneNumber,7,4)

【讨论】:

  • 我不认为你可以使用+在postgres中追加字符串
  • 对不起,我已经修复了||而不是 +
  • 这还是不正确的!我继续为我的查询修复它:' (' || SUBSTRING(callers.phone_number::text, 1, 3) || ') ' || SUBSTRING(callers.phone_number::text, 4,3) || '-' || SUBSTRING(callers.phone_number::text,7,4)
【解决方案4】:
SELECT '(' || SUBSTRING(phone FROM 1 FOR 3) || ') ' || 
              SUBSTRING(phone FROM 4 FOR 3) || '-' || 
              SUBSTRING(phone FROM 7 FOR 4) 
FROM table;

这将返回格式为 (123) 456-7890 的所有电话号码,但不会有列标题。要解决此问题,请使用以下 SELECT 语句:

SELECT '(' || SUBSTRING(phone FROM 1 FOR 3) || ') ' || SUBSTRING(电话从 4 到 3)|| '-' || SUBSTRING(phone FROM 7 FOR 4) AS Phone FROM 章节;

希望这会有所帮助!

【讨论】:

【解决方案5】:

另一种选择是使用FORMAT 函数。详情请见Postgresql string functions

你的例子看起来像

SELECT FORMAT('(%s)%s-%s', SUBSTR(phone, 1, 3), SUBSTR(phone, 4, 3), SUBSTR(phone, 7, 4))
FROM table;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多