将varchar列的值拆分为两列

时间:2014-07-18 15:23:47

标签: sql sql-server tsql case

如果我有一个字符串,其中字符串的长度不同但是所有字符串中都有一个斜杠\, 如何选择让一列显示\之前的所有内容,另一列显示\之后的所有内容?

name         column1     column2
DB5697\DEV   DB5697      DEV

我在MSDN上看到了CHARINDEXREVERSE,但还没有能够整理出来。

如何最好地将varchar / string列值拆分为TSQL结果集中的2列?

5 个答案:

答案 0 :(得分:4)

如何以棘手的方式使用PARSENAME函数?

USE tempdb;
GO

CREATE TABLE #names 
(
      id int NOT NULL PRIMARY KEY CLUSTERED
    , name varchar(30) NOT NULL
);
GO

INSERT INTO #names (id, name)
VALUES 
    (1, 'DB5697\DEV'),
    (2, 'DB5800\STG'),
    (3, 'DB5900\PRD');
GO

SELECT
      name
    , PARSENAME(REPLACE(name, '\', '.'), 2) AS [Server]
    , PARSENAME(REPLACE(name, '\', '.'), 1) AS [Instance]
FROM
    #names;
GO

DROP TABLE #names;
GO

PARSENAME函数接受2个参数,并获取完全限定名称的名称部分。第二个参数是部件名称枚举器。

值2表示SCHEMA,1表示OBJECT。

所以,使用REPLACE函数" \" char由"替换。"为了具有SERVERNAME \ INSTANCE值的SCHEMA.OBJECT格式。然后,PARSENAME的行为就像在字符串中有一个简单的对象名。

答案 1 :(得分:3)

以下内容(SQL Fiddle):

SELECT m.name,
       LEFT(m.name, CHARINDEX('\', m.name) - 1) AS column1,
       RIGHT(m.name, LEN(m.name) - CHARINDEX('\', m.name)) AS column2
FROM MyTable m

如何处理其中没有\的字符串(SQL Fiddle):

SELECT m.name,
       CASE WHEN CHARINDEX('\', m.name) = 0 THEN ''
            ELSE LEFT(m.name, CHARINDEX('\', m.name) - 1) END AS column1,
       CASE WHEN CHARINDEX('\', m.name) = 0 THEN '' 
            ELSE RIGHT(m.name, LEN(m.name) - CHARINDEX('\', m.name)) END AS column2
FROM MyTable m;

答案 2 :(得分:3)

您可以使用CHARINDEX检查拆分器的字符位置(' /')并使用SUBSTRING拆分字符串。 但是,必须注意确保您在没有拆分器的情况下处理记录,否则您将调用错误。 此外,在拆分器不可用的情况下,必须决定数据应映射到哪一列。这里我将数据映射到FirstName并将NULL分配给LastName

DECLARE @TableBuyer TABLE (ID INT, FullName VARCHAR(100))

INSERT INTO @TableBuyer
SELECT '1','Bryan/Greenberg' UNION ALL
SELECT '2','Channing/Tatum' UNION ALL
SELECT '3','Paul/William' UNION ALL
SELECT '4','EricBana' UNION ALL
SELECT '5','James/Lafferty' UNION ALL
SELECT '6','Wentworth/Miller'

SELECT
       CASE
       WHEN CHARINDEX('/', FullName) > 0 THEN SUBSTRING(FullName, 1, CHARINDEX('/', FullName) - 1)
       ELSE FullName
       END AS FirstName
       ,
       CASE
       WHEN CHARINDEX('/', FullName) > 0 THEN SUBSTRING(FullName, CHARINDEX('/', FullName) + 1, LEN(FullName))
       ELSE NULL
       END AS LastName
FROM @TableBuyer;

答案 3 :(得分:3)

DECLARE @TableBuyer TABLE (ID INT, FullName VARCHAR(100))

INSERT INTO @TableBuyer
SELECT '1','Bryan/Greenberg' UNION ALL
SELECT '2','Channing/Tatum' UNION ALL
SELECT '3','Paul/William' UNION ALL
SELECT '4','EricBana' UNION ALL
SELECT '5','James/Lafferty' UNION ALL
SELECT '6','Wentworth/Miller'


select left(FullName, len(FullName)-CHARINDEX('/', REVERSE(FullName))) as firstname,
substring(FullName, len(FullName)-CHARINDEX('/', REVERSE(FullName))+ 2, len(FullName)) as lastname
from @TableBuyer

OR

select left(FullName, len(FullName)-CHARINDEX('/', REVERSE(FullName))) as firstname,
RIGHT(FullName, len(FullName)-CHARINDEX('/', FullName)) as lastname
from @TableBuyer

答案 4 :(得分:2)

没有“简单”的方法。这样的事情应该有效:

select left(col, charindex('\', col) - 1) as column1,
       right(col, charindex('\', reverse(col)) - 1) as column2

您可能需要加倍反斜杠('\\')以使其正常工作。

相关问题