有没有办法使用order by来一起订购类似的字段?

时间:2018-06-08 15:25:38

标签: postgresql

有没有办法在订单中使相似的值相等?

说数据是:

name  | number
John. | 9
John  | 1
John. | 2
Smith | 4
John  | 3

我想按名称和编号排序,以便输出看起来像这样,但order by name, number会将所有John条目放在John.条目之前。< / p>

name  | number
John  | 1
John. | 2
John  | 3
John. | 9
Smith | 4

3 个答案:

答案 0 :(得分:0)

您需要在名称字段上进行更高级的处理。 本主题将帮助您在订购之前从字符串中删除非字母字符: How to strip all non-alphabetic characters from string in SQL Server?

但是你需要这么复杂的功能让我质疑数据库的构建过程:如果是“John”和“John”。是同一个人,他们应该有相同的名字。所以,如果“。”很重要,这意味着您需要另一个字段来存储它所代表的信息。

答案 1 :(得分:0)

答案 2 :(得分:0)

使用正则表达式替换功能去除数据中的所有特殊字符,替换为空格。然后将其包装在TRIM函数中以删除空格

  TRIM(CASE 
   WHEN name LIKE '%.%'
   OR name LIKE '%_%'
   OR name ~ '%\d%' --This is for a number
    THEN
      REGEXP_REPLACE(name, '(\_|\.|\d)', ' ' ) END) AS name_processed

括号中的位表示用逗号后面的任何内容替换下划线或(|)句点或数字,这里是空格

现在您可以通过name_processed和数字来订购

 ORDER BY name_processed, number DESC

但是,如果您先通过WITH编写子查询,则可以随后在SELECT中保留原始名称。如果你想这样做,请告诉我。基本上,合成器将是:

WITH processed_names AS (
SELECT
 name,
 TRIM(CASE 
   WHEN name LIKE '%.%'
   OR name LIKE '%_%'
   OR name ~ '%\d%' --This is for a number
   THEN
      REGEXP_REPLACE(name, '(\_|\.|\d)', ' ' ) END) AS name_processed,
number
 FROM names
  ORDER BY 2,3 DESC)

SELECT
name,
number
 FROM processed_names;
相关问题