Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询Lastname,字符串中的名字_Sql_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

SQL查询Lastname,字符串中的名字

SQL查询Lastname,字符串中的名字,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,嘿,我有一个字符串,格式如下: 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 我确信我可以找到-,然后抓住右边的所有东西,但

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

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
我确信我可以找到-,然后抓住右边的所有东西,但是我怎么能在那之后颠倒名称呢


任何帮助都会很好

您可以使用
CHARINDEX
SUBSTRING

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个部件名称或标题出现故障时,它们可能是边缘情况,如
-

这里有一个选项:

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

你在用什么编程语言?这与SQL有什么关系(除非3个字符串是数据库查询中的3个单元格)?这听起来像是对文本的简单字符串操作。你能展示一下你到目前为止所写的代码以及你遇到的困难吗?你希望Billy Bob Thornton的结果是什么?如果此数据没有单独的字段,那么Benicio del Toro怎么样。祝你好运,当涉及到数据时,名称是最棘手的事情之一,因为几乎没有规则。@DStanley这是他们在旧时代设计数据库的方式,因此,我们必须维护它并对其进行黑客攻击,以完成简单的事情,如果一开始就做对了,我们不需要黑客。@所有人都不需要否决一个合法的问题……这正是我需要做的。。。然而,它现在并没有以这个姓氏将其列入ASC订单。。它仍然使用名字作为order by。您可以将其添加到末尾:
order by SUBSTRING(rowNameOcu,CHARINDEX(“”,rowNameOcu),CHARINDEX(“”,right(rowNameOcu,len(rowNameOcu)-CHARINDEX(“”,rowNameOcu)))asc
Ah,将LastFirstName添加到反面([ITACRep])的末尾修复了这个问题。