Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何解析以逗号分隔的列?_Sql_Sql Server_String_Parsing - Fatal编程技术网

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

Sql 如何解析以逗号分隔的列?,sql,sql-server,string,parsing,Sql,Sql Server,String,Parsing,我有以下选择查询(使用SQL Server 2017): 输出是一个非常长的分号分隔字符串,我只想返回前两个字段 电流输出: AmericanExpress;XXXXXXXXXXX4111;;;;41.47;8.00............... MasterCard;XXXXXXXXXXXX7971;;;;40.22;10.00................ Visa;XXXXXXXXXXXX6302;;;;11.94;0.00.................... 期望输出: Amer

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

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

电流输出:

AmericanExpress;XXXXXXXXXXX4111;;;;41.47;8.00...............
MasterCard;XXXXXXXXXXXX7971;;;;40.22;10.00................
Visa;XXXXXXXXXXXX6302;;;;11.94;0.00....................
期望输出:

AmericanExpress;XXXXXXXXXXX4111
MasterCard;XXXXXXXXXXXX7111
Visa;XXXXXXXXXXXX6111
如果可能的话,我想把它们分成两列


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

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

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

创建下面的函数

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
然后在查询中使用它

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%')

您使用的是哪种数据库引擎?我正在使用MS SQL 2017引擎。查看并考虑使用它的子查询作为数据集的一个字段。抱歉,这没有帮助。我想用分号来划分前两个字段。付款信息似乎是包含分号的巨大字符串,或者您没有给我们提供足够的信息。通过使用substring函数,它仍然会包含分号。因为有几种不同的卡片类型,所以字符串的长度会有所不同。我已经更新了我的问题,以显示需要取出的不同卡片类型。因此,您要么想要两列,要么想要用分号分隔,就是这样?您应该能够打开一个新的查询窗口并运行该代码,这是一个完整的示例。我遇到以下错误:SQL文本无法在网格窗格和图表窗格中表示。您在创建函数或运行查询时遇到错误了吗?运行查询时,我将函数放在查询的顶部。函数是否在我正在构建的查询中?否,您应该首先运行create函数。它将在可编程性->函数->标量值函数中可用。然后您可以运行查询,而不会出现任何问题。如果我只是自行运行函数,则会出现该错误。我会出现以下错误:函数参数列表中的错误:“FROM”无法识别。函数参数列表中出现错误:“和”无法识别。无法分析查询text@joey.coyle缺失)
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%')
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