sql - 循环在一列中的分隔列表
问题描述
正在将应用程序中的列从在固定宽度列中存储长字符串更新为分隔列。目前,我根据位置使用substring()
.
现在它正在更新为使用分隔符 (~) 来解析一列中的每个字段,我不确定如何提取数据并将它们写入另一个表中的各个字段。以下是示例数据和 T-SQL:
数据
Radio $7.00~Shirt $79.99~Late Fee $9.95~Small Hat $7.00~Taxes $0.19
SQL:
INSERT INTO TempTable2 (Offer1, Offer2)
SELECT
SUBSTRING(OfferString, 1, 81) AS Offer1,
SUBSTRING(OfferString, 82, 81) AS Offer2
FROM
TempTable
在固定宽度的方法中,我可以将每个单独的值存储到它们自己的列中,如上所述,但不确定如何继续使用新的基于分隔符的结构。
有人可以阐明一下吗?在 SQL Server 2008 R2 上运行。
解决方案
更新的版本有一个string_split()
功能。这允许这种方法:
INSERT INTO TempTable2 (Offer1, Offer2)
SELECT s.Offer1, s.Offer2
FROM TempTable t CROSS APPLY
(SELECT MAX(CASE WHEN seqnum = 1 THEN value END) as offer1,
MAX(CASE WHEN seqnum = 2 THEN value END) as offer2
FROM (SELECT s.value,
ROW_NUMBER() OVER (ORDER BY CHARINDEX('~' + s.value + '~', '~' + t.OfferString + '~') as seqnum
FROM string_split(t.OfferString, '~') s
) s
) s;
请注意,谣言也ORDER BY (SELECT NULL)
将保留原始顺序。但是,该功能未记录在案。
推荐阅读
- assembly - 当 esp 不是非常低时,汇编程序函数不执行
- php - 如何使用 PHP 两次显示相同的 MySQL 查询?
- reactjs - React 测试库:测试属性/prop
- python - 错误“布尔”对象没有属性“find_element_by_id”
- c - 试图调整 sscanf() 以忽略 \n 和 \t
- macos - 如何在 macOS 上以编程方式获取当前工作区
- php - 使用三元运算符处理多个语句
- winforms - 在 Visual Basic 窗体应用程序中使用 GoTo
- git - Git为远程添加不同的别名/昵称关于获取和推送
- javascript - 如何在二维中找到给定 A、B 坐标的平行线