sql查询,获取每个单词的第一个字母,并用点和空格分隔

u3r8eeie  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(375)

我从来没有真正使用过sql,但最近由于在家工作的变化,迫使我在这方面获得一些知识。到目前为止,我一直做得很好,但我现在遇到了一个似乎找不到解决办法的问题。
我有一个excel表格,它通过vba代码运行的sql查询来提取客户信息。
我首先需要做的是从一个客户那里得到一个全名,并将其输入到表单中。这个很好用。我对此使用以下查询:

Select concat(concat(Customer_First_Names,' '), Customer_Last_Name) FROM CustomerInformationTable where Customer_Number = &&1

这给我一个客户的全名,名字和姓氏之间以及名字之间的空格(全名在表中已经用空格隔开)。
现在,我收到了另一个请求,请求不检索客户的第一个完整的名字和姓氏,而是检索他们的首字母和姓氏。
例如:
巴拉克·侯赛因·奥巴马
会变成
b。h。奥巴马
为此我需要做两件事:
我需要更改查询以只检索每个名字的缩写。如我所说,所有完整的名字(即使客户有一个以上的名字)都位于customer\u first\u names列中。
我需要在每个首字母后面加一个点和一个空格。
我该怎么办?我一直在考虑使用子字符串,但我正在努力如何做到这一点,如果有一个以上的名字。
所以这是行不通的:

Select concat(substr(Customer_First_Names, 1, 1), '. ') from CustomerInformationTable where Customer_Number = &&1

很抱歉,如果到目前为止董事会上已经有人问过这个问题,我看了一下,但没有找到合适的解决办法。

qvk1mo1f

qvk1mo1f1#

假设你不想看到只有一个名字的人后面有两个点(比如j。。史密斯),那么这里有一个解决方案,适用于postgres。不确定您的数据库是什么,所以您可能需要根据需要进行调整。
“with”查询正在拆分名字,限制为两个。“case”语句然后检查此人是否有第二个名字。如果不是,则只提供第一个首字母,后跟一个点。否则,两个首字母后面都跟一个点。最后的结果是,所有的首字母和名字用空格隔开(比如t。r。史密斯)。
一张这样的table:
cid前最后
1杰克·史密斯
2特雷尔·霍华德·威廉姆斯
3菲比m凯蒂
将使用下面的查询生成以下结果。
cid客户名称
1 j。史密斯
2吨。h。威廉姆斯
下午3点。m。凯蒂

with first_names as 
        (select distinct customer_number , 
        split_part(customer_first_name, ' ', 1) as first1,
        split_part(customer_first_name, ' ', 2) as first2
        from CustomerInformationTable 
        )
    select distinct customer_number,
    case
        when fn.first2 = '' then substring(fn.first1, 1, 1) || '.'
        else substring(fn.first1, 1, 1) || '. ' || substring(fn.first2, 1, 1) || '.'
    end
    || ' ' || a.customer_last_name as cust_name
    from CustomerInformationTable  a
    join first_names fn on fn.customer_number  = a.customer_number

相关问题