如果我有一个字符串,其中字符串的长度不同但是所有字符串中都有一个斜杠\
,
如何选择让一列显示\
之前的所有内容,另一列显示\
之后的所有内容?
name column1 column2
DB5697\DEV DB5697 DEV
我在MSDN上看到了CHARINDEX
和REVERSE
,但还没有能够整理出来。
如何最好地将varchar / string列值拆分为TSQL结果集中的2列?
答案 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
您可能需要加倍反斜杠('\\'
)以使其正常工作。