【问题标题】:SQL query Lastname, first name within stringSQL查询姓氏,字符串中的名字
【发布时间】:2015-09-22 18:51:54
【问题描述】:

嘿,我有一个格式如下的字符串:

Bob Barker - The Game Show Host
Bill Gates - A Programmer
Steve Jobs - The Apple Guy

上面是一行叫rowNameOcu。

我要做的是查询它并像这样呈现它:

Barker, Bob - The Game Show Host
Gates, Bill - A Programmer
Jobs, Steve - The Apple Guy

我确定我可以查找 -,然后抓住它右侧的所有内容,但是在那之后我该如何反转名称呢?

任何帮助都会很棒!

【问题讨论】:

  • 您使用什么编程语言?这与 SQL 有什么关系(除非 3 个字符串是来自数据库查询的 3 个单元格)?这听起来像是对文本的简单字符串操作。你能展示一下你到目前为止写的代码以及你卡在哪里了吗?
  • 您希望Billy Bob Thornton 的结果是什么? Benicio del Toro呢?
  • 如果您没有用于此数据的单独字段。祝你好运,名称是数据方面最棘手的事情之一,因为几乎没有规则。
  • @DStanley 这是他们在过去设计数据库的方式,因此,我们必须维护它并破解它来做一些简单的事情,如果一开始就做对了地方,我们不需要破解。
  • @All 无需对合法问题投反对票....

标签: sql sql-server database sql-server-2008


【解决方案1】:

这是一个选项:

SELECT  
SUBSTRING(rowNameOcu,CHARINDEX(' ',rowNameOcu),CHARINDEX(' ',right(rowNameOcu,len(rowNameOcu) - CHARINDEX(' ',rowNameOcu)))) + ', ' + left(rowNameOcu,CHARINDEX(' ',rowNameOcu)) + RIGHT(rowNameOcu, CHARINDEX('-',reverse(rowNameOcu)))  
FROM MyTable

【讨论】:

  • 这确实做了我需要做的事情......但是,它现在没有按姓氏将其放入 ASC 顺序中......它仍然使用名字作为 order by。
  • 你可以把这个加到最后:ORDER BY SUBSTRING(rowNameOcu,CHARINDEX(' ',rowNameOcu),CHARINDEX(' ',right(rowNameOcu,len(rowNameOcu) - CHARINDEX(' ',rowNameOcu)))) asc
  • 啊,将 AS LastFirstName 添加到 reverse([ITACRep]))) 的末尾修复了该问题。
【解决方案2】:

您可以使用CHARINDEXSUBSTRING

SqlFiddleDemo

Declare @t table ( [Name] varchar(100) );

insert into @t ( Name )
VALUES ( 'Bob Barker - The Game Show Host' ),
      ('Bill Gates - A Programmer'),
      ('Steve Jobs - The Apple Guy') ;

;WITH cte AS
(SELECT
    [Name],
    [Title] = CASE WHEN CHARINDEX('-', [Name]) > 0 THEN
                       SUBSTRING([Name],CHARINDEX('-',[Name])+1, ( LEN([Name]) - CHARINDEX(' ',[Name])+1) )
                       ELSE NULL
                   END,   
    [FIRST_NAME] = CASE WHEN CHARINDEX(' ', [Name]) > 0 THEN
                      LEFT([Name],CHARINDEX(' ',[Name])-1)
                      ELSE[Name]
                    END,
    [LAST_NAME] = CASE WHEN CHARINDEX(' ', [Name]) > 0 THEN
                       SUBSTRING([Name],CHARINDEX(' ',[Name])+1, (CHARINDEX('-',[name]) - CHARINDEX(' ', [name])-1) )
                       ELSE NULL
                   END 
FROM @t
)
SELECT [Last_Name] + ', ' + [First_Name] + ' - ' + [Title]
FROM cte;

警告:当它失败时,它们可能是边缘情况,例如带有-的 3 部分名称或标题

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多