我在创建查询时遇到了问题,因为在我的表中没有重复的值。不幸的是,“全名”列的名称和姓氏顺序不同。
例如:
+----+----------------------+
| ID | Full Name |
+----+----------------------+
| 1 | Marshall Wilson |
| 2 | Wilson Marshall |
| 3 | Lori Hill |
| 4 | Hill Lori |
| 5 | Casey Dean Davidson |
| 6 | Davidson Casey Dean |
+----+----------------------+
我想得到这样的结果:
+----+-----------------------+
| ID | Full Name |
+----+-----------------------+
| 1 | Marshall Wilson |
| 3 | Lori Hill |
| 5 | Casey Dean Davidson |
+----+-----------------------+
我的目标是创建查询,它以类似的方式获取,例如:按相同的顺序选择distinct作为名称和姓氏。
有什么想法吗?
1条答案
按热度按时间tktrz96b1#
它需要大量的字符串操作和使用多个派生表。可能效率不高。
我们首先标记
FullName
它由多个单词组成。为此,我们使用一个数字生成器表gen
. 在本例中,我假设子字符串的最大数目是3。你可以通过添加更多的选择来扩展它,比如,SELECT 4 UNION ALL ..
等等。我们使用
Substring_Index()
与Replace()
函数以使用单个空格字符获取子字符串(' '
)作为分隔符。Trim()
用于删除所有左前导/尾随空格。现在,技巧是使用这个结果集作为派生表,并执行
Group_Concat()
按升序排列。这样,即使是重复的名称(但子字符串的顺序不同),也会得到相似的结果words_sorted
价值观。最终,我们只需要Group By
在words_sorted
剔除重复的。查询#1
db fiddle视图