我有以下select查询(使用SQL Server 2017):
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输出是一个很长的分号分隔的字符串,我只想返回前两个字段。
当前输出:
AmericanExpress;XXXXXXXXXXX4111;;;;41.47;8.00...............
MasterCard;XXXXXXXXXXXX7971;;;;40.22;10.00................
Visa;XXXXXXXXXXXX6302;;;;11.94;0.00....................所需输出:
AmericanExpress;XXXXXXXXXXX4111
MasterCard;XXXXXXXXXXXX7111
Visa;XXXXXXXXXXXX6111如果可能的话,我想把它们分成两列。
我查看了堆栈,发现了类似的问题,但没有找到一个有效的答案,也没有找到根据我的情况如何修改的答案。
发布于 2018-01-27 05:05:00
创建下面的函数。
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%')发布于 2018-01-27 04:59:05
这将返回一个列,其中的值用分号分隔:
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发布于 2018-01-27 05:06:50
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_NAMEhttps://stackoverflow.com/questions/48469283
复制相似问题