首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解析以逗号分隔的列?

如何解析以逗号分隔的列?
EN

Stack Overflow用户
提问于 2018-01-27 04:46:34
回答 3查看 222关注 0票数 1

我有以下select查询(使用SQL Server 2017):

代码语言:javascript
运行
复制
SELECT PAYMENT_INFO
FROM CHECK_PAYMENT
WHERE (PAYMENT_FISCAL_DATE = '01/19/2018')
  AND (TENDER_MEDIA_NAME LIKE 'PaymentCard%')
ORDER BY VOID, TENDER_MEDIA_NAME

输出是一个很长的分号分隔的字符串,我只想返回前两个字段。

当前输出:

代码语言:javascript
运行
复制
AmericanExpress;XXXXXXXXXXX4111;;;;41.47;8.00...............
MasterCard;XXXXXXXXXXXX7971;;;;40.22;10.00................
Visa;XXXXXXXXXXXX6302;;;;11.94;0.00....................

所需输出:

代码语言:javascript
运行
复制
AmericanExpress;XXXXXXXXXXX4111
MasterCard;XXXXXXXXXXXX7111
Visa;XXXXXXXXXXXX6111

如果可能的话,我想把它们分成两列。

我查看了堆栈,发现了类似的问题,但没有找到一个有效的答案,也没有找到根据我的情况如何修改的答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-27 05:05:00

创建下面的函数。

代码语言:javascript
运行
复制
CREATE FUNCTION dbo.ColumnSplitter
(
  @String VARCHAR(MAX),
  @NroSubString INT,
  @Separator VARCHAR(5)
)
RETURNS VARCHAR(MAX) AS
BEGIN
    DECLARE @St INT = 0, @End INT = 0, @Ret VARCHAR(MAX)
    SET @String = @String + @Separator
    WHILE CHARINDEX(@Separator, @String, @End + 1) > 0 AND @NroSubString > 0
    BEGIN
        SET @St = @End + 1
        SET @End = CHARINDEX(@Separator, @String, @End + 1)
        SET @NroSubString = @NroSubString - 1
    END
    IF @NroSubString > 0
        SET @Ret = ''
    ELSE
        SET @Ret = SUBSTRING(@String, @St, @End - @St)
    RETURN @Ret
END
GO

然后在您的查询中使用它。

代码语言:javascript
运行
复制
SELECT dbo.ColumnSplitter(PAYMENT_INFO, 1, ';') as FirstColumn,
       dbo.ColumnSplitter(PAYMENT_INFO, 2, ';') as SecondColumn      
FROM CHECK_PAYMENT
WHERE (PAYMENT_FISCAL_DATE = '01/19/2018')
  AND (TENDER_MEDIA_NAME LIKE 'PaymentCard%')
票数 1
EN

Stack Overflow用户

发布于 2018-01-27 04:59:05

这将返回一个列,其中的值用分号分隔:

代码语言:javascript
运行
复制
declare @example as table (
    exampleid int identity(1,1) not null primary key clustered
,   value_ nvarchar(255) not null
);

insert into @example (value_)

select 'AmericanExpress;XXXXXXXXXXX4111;;;;41.47;8.00...............' union all
select 'MasterCard;XXXXXXXXXXXX7971;;;;40.22;10.00................' union all
select 'Visa;XXXXXXXXXXXX6302;;;;11.94;0.00....................'

select substring(value_, 0, charindex(';', value_, charindex(';', value_) + 1)) Payment_Info
  from @example
票数 0
EN

Stack Overflow用户

发布于 2018-01-27 05:06:50

代码语言:javascript
运行
复制
SELECT        LEFT(PAYMENT_INFO, 
                   CHARINDEX(';', PAYMENT_INFO, 
                             CHARINDEX(';', PAYMENT_INFO) + 1))
FROM          CHECK_PAYMENT
WHERE        (PAYMENT_FISCAL_DATE = '01/19/2018')
     AND (TENDER_MEDIA_NAME LIKE 'PaymentCard%')
ORDER BY VOID, TENDER_MEDIA_NAME
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48469283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档