如何在sql中拆分逗号分隔的字符串

时间:2015-02-01 12:19:03

标签: sql jsp

只有在逗号3次出现在sql中后才能拆分。 我有一个看起来像这样的字符串

"abc,123,855,jkl,ddd,rrr,sss,999,777,kkk,jkl,ddd,rrr,sss,999" 

从db获取此信息。 我想要返回的是一个字符串[],它在每三个逗号之后被拆分,所以它看起来像这样:

abc,123,855,
jkl,ddd,rrr,
sss,999,777,
kkk,jkl,ddd,
rrr,sss,999

需要在我的JSP页面中显示此字段,目前它占用了表行的更多空间。 非常感谢我能得到的任何帮助!

3 个答案:

答案 0 :(得分:1)

这是完整的例子。

DECLARE @valueList varchar(8000)
DECLARE @pos INT
DECLARE @len INT
DECLARE @value varchar(8000)
SET @valueList = 'Pakistan,UAE,USA,UK,'

set @pos = 0
set @len = 0

WHILE CHARINDEX(',', @valueList, @pos+1)>0
BEGIN
    set @len = CHARINDEX(',', @valueList, @pos+1) - @pos
    set @value = SUBSTRING(@valueList, @pos, @len)
    SELECT @pos, @len, @value

    set @pos = CHARINDEX(',', @valueList, @pos+@len) +1
END

答案 1 :(得分:0)

MS SQL的解决方案。假设带有逗号的字符串在表中的列中,并且可能有更多行具有更多不同的字符串。还假设解析后剩余的最后一个字符串可能少于3个逗号。

使用两个循环,第一个循环检查是否还有要处理的行。第二个内部循环是检查是否还有剩余的字符串,并且要处理逗号。

包含逗号字符串列TableWithCommaStrings的原始表 在这种情况下,最终表只有临时#Temp_3,但您可以将其插入任何位置。

IF OBJECT_ID('tempdb..#Temp_1') IS NOT NULL DROP TABLE #Temp_1
SELECT * 
  INTO #Temp_1 
  FROM TableWithCommaStrings 
;

DECLARE @RowCount AS INT = 1;
WHILE @RowCount >= 1 
BEGIN

    IF OBJECT_ID('tempdb..#Temp_2') IS NOT NULL DROP TABLE #Temp_2
    SELECT TOP 1 * /* Pick Only First line */
      INTO #Temp_2
      FROM #Temp_1;

    WITH AA AS (SELECT TOP 1 * FROM #Temp_1 ) /* Delete that first line from Temp1*/
    DELETE FROM AA;

        /* Parse Column till last comma character remain there*/
        DECLARE @CommaCharCount AS INT = 3;
        WHILE @CommaCharCount >= 3 
        BEGIN
            IF OBJECT_ID('tempdb..#Temp_3') IS NULL CREATE TABLE #Temp_3 (YourStringColumn VARCHAR(MAX));
            INSERT INTO #Temp_3 /* Insert substring into temp3 based on Third Comman from beginning*/
            SELECT substring(AA.YourStringColumn,1,(CharIndex(',',AA.YourStringColumn,Charindex(',',AA.YourStringColumn,CharIndex(',',AA.YourStringColumn)+1) +1))-1)
            FROM #Temp_2 AS AA

            UPDATE BB /*Remove part of string which has been procssed already in step above*/
            SET BB.YourStringColumn = substring(YourStringColumn,((CharIndex(',',YourStringColumn,Charindex(',',YourStringColumn,CharIndex(',',YourStringColumn)+1) +1)+1)+1),LEN(YourStringColumn))
            FROM #Temp_2 AS BB

            /* Set comma counter */
            SELECT @CommaCharCount= LEN(YourStringColumn) - LEN(REPLACE(YourStringColumn, ',', '')) FROM #Temp_2

        END

IF (SELECT LEN(YourStringColumn) FROM #Temp_2) > 0  
    INSERT INTO #Temp_3 /* Last remaining Characters */
    SELECT YourStringColumn
    FROM #Temp_2

SELECT @RowCount = COUNT(*) FROM #Temp_1;

END

答案 2 :(得分:0)

您可以使用JSTL在JSP中更轻松地完成此任务。事实上,由于您的实际需求仅仅是显示,您甚至不需要创建数组。以下是使用<c:forTokens> JSTL标记的方法。

<c:set var="sqlString" value="abc,123,855,jkl,ddd,rrr,sss,999,777,kkk" />

<c:forTokens var="token" varStatus="tokenCounter" items="${sqlString}" delims=",">
    <c:out value="${token}" />,
    <c:if test="${tokenCounter.count % 3 == 0}">
        <br />
    </c:if>
</c:forTokens>