使用SQL Server 2008
我希望用分号分割字符串。字符串值有分号,有时没有分号。
示例#1:
String = abceder-ere1212;eferere2121212 (with Semicolon)
输出
string1 = abceder-ere1212
string2 = eferere2121212
示例#2:
String: abcederdfdfd (without Semicolon)
输出
string1 = abcederdfdfd
string2 = ''
以下代码正常,但我想在查询中的多个位置使用,需要一个函数而不是代码。
DECLARE
@remarks varchar(max),
@vc_pen varchar(max),
@vc_adjust varchar(max)
Select @remarks = remarks
from table1
SELECT
@vc_pen = SUBSTRING(S, 1, P - 1),
@vc_adjust = SUBSTRING(S, P + 1, L - P)
FROM
(SELECT
S = @remarks,
P = CHARINDEX(';', @remarks),
L = LEN(@remarks)) s;
如何编写查询或函数来拆分字符串?请帮助
答案 0 :(得分:0)
尝试类似通用的东西:
CREATE FUNCTION split
(
@string VARCHAR(MAX),
@delimiter CHAR(1)
) RETURNS @output TABLE(index INT, splitteddata VARCHAR(MAX))
BEGIN
DECLARE @start INT, @end INT, @index INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string), @index = 1
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitteddata)
VALUES(@index, SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @index = @index + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
Query:
SELECT *
FROM split('abceder-ere1212;eferere2121212',';')
Output:
1 abceder-ere1212
2 eferere2121212
答案 1 :(得分:0)
尝试这样的事情......
测试数据
DECLARE @Table TABLE (ID INT, Value VARCHAR(MAX))
INSERT INTO @Table VALUES
(1 , 'abceder-ere1212;eferere2121212')
,(2 , 'abceder-ere1234')
<强>查询强>
SELECT ID
,REPLACE(Split.a.value('.', 'VARCHAR(100)'), '000000', '') Value
,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) Output_Value
FROM (SELECT ID
,Cast ('<M>' + Replace(CASE WHEN Value NOT LIKE '%;%' THEN Value + ';000000'
ELSE Value END
, ';', '</M><M>') + '</M>' AS XML) AS Data
FROM @Table) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)
<强>结果强>
╔════╦═════════════════╦══════════════╗
║ ID ║ Value ║ Output_Value ║
╠════╬═════════════════╬══════════════╣
║ 1 ║ abceder-ere1212 ║ 1 ║
║ 1 ║ eferere2121212 ║ 2 ║
║ 2 ║ abceder-ere1234 ║ 1 ║
║ 2 ║ ║ 2 ║
╚════╩═════════════════╩══════════════╝
如果只有两个可能的值
您可以执行以下操作
测试数据
DECLARE @Table TABLE (ID INT, Value VARCHAR(MAX))
INSERT INTO @Table VALUES
(1 , 'abceder-ere1212;eferere2121212')
,(2 , 'abceder-ere1234')
<强>查询强>
;WITH CTE AS
( SELECT ID
,REPLACE(CASE WHEN Value NOT LIKE '%;%'
THEN Value + '|000000'
ELSE Value END, ';', '|') AS Value
FROM @Table
)
SELECT ID
,LEFT(Value , CHARINDEX('|', Value) -1) FirstValue
,REPLACE(RIGHT(Value, LEN(Value) - CHARINDEX('|', Value)), '000000', '') SecondValue
FROM CTE
结果集
╔════╦═════════════════╦════════════════╗
║ ID ║ FirstValue ║ SecondValue ║
╠════╬═════════════════╬════════════════╣
║ 1 ║ abceder-ere1212 ║ eferere2121212 ║
║ 2 ║ abceder-ere1234 ║ ║
╚════╩═════════════════╩════════════════╝
答案 2 :(得分:0)
尝试使用PARSENAME
这样的功能:
SELECT PARSENAME(REPLACE(@remarks, ';', '.'), 2) AS string1,
PARSENAME(REPLACE(@remarks, ';', '.'), 1) AS string2
以下是一个代码,可以在零开的字段中显示您的部件:
DECLARE @text VARCHAR(1000);
SET @text = 'SELECT ''' + REPLACE(@remarks, ';', ''',''') + ''''
EXEC(@text)
另一方面,这更好(将结果发送到表格):
DECLARE @text VARCHAR(1000)
SET @text = 'SELECT ''' + REPLACE(@remarks, ';', ''' As part union all SELECT ''') + ''' As part'
EXEC(@text)
为了得到一个resultTable,将上面改为下面:
SET @text = 'SELECT part INTO resultTable FROM (select ''' + REPLACE(@remarks, ';', ''' As part UniON ALL SELECT ''') + ''' As part) dt '
我认为当您将结果设置为datatable
或stored procedure
时,此答案非常有用。