有没有办法在订单中使相似的值相等?
说数据是:
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
答案 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;