【发布时间】:2023-03-19 20:40:01
【问题描述】:
我有一个如下所示的 Textcol:
文本示例:
Note:test note
Phone Call: Fairview Wines & Spirits
Number Called: 1 604 601-8000
Phone Description: Main
Subject: Arrange meeting
Result: Arranged interview
Duration: 00:00:09
如果可能的话,我想将主题、结果和注释分成四个单独的列。我尝试了两种方法:
第一个例子:
SELECT "Note"=SUBSTRING(TextCol,1,25),"Subject"=SUBSTRING(TextCol,110,25)
,"Result"=SUBSTRING(TextCol,135,33) FROM AMGR_Notes where type = 2
第二个例子:
SELECT
RTRIM(LTRIM(REPLACE(REPLACE(SUBSTRING(T.TextCol, A.SubjectStart + 8, A.ResultStart - A.SubjectStart - 8), CHAR(10), ''), CHAR(13), ''))) AS [Subject]
,RTRIM(LTRIM(REPLACE(REPLACE(SUBSTRING(T.TextCol, A.ResultStart + 7, A.DurationStart - A.ResultStart - 7), CHAR(10), ''), CHAR(13), ''))) AS Result
,RTRIM(LTRIM(REPLACE(REPLACE(SUBSTRING(T.TextCol, 6, A.PhoneStart - 6), CHAR(10), ''), CHAR(13), ''))) AS Note
FROM AMGR_Notes T
CROSS APPLY
(
VALUES
(
CHARINDEX('Phone Call:', T.TextCol)
,CHARINDEX('Subject:', T.TextCol)
,CHARINDEX('Result:', T.TextCol)
,CHARINDEX('Duration:', T.TextCol)
)
) A (PhoneStart, SubjectStart, ResultStart, DurationStart);
第二个例子报错:
消息 537,级别 16,状态 3,行 1 传递给的长度参数无效 LEFT 或 SUBSTRING 函数。
当谈到 SQL 时,我不是一个超级天才,所以我不明白这个错误。 我也想知道 CASE 语句在这种情况下是否会更好
任何帮助将不胜感激
【问题讨论】:
-
请标记您正在使用的正确数据库,我假设它是 T-sql
-
你能提供预期的输出吗?
-
很简单,不是吗?运行
select,它会显示所有字符串、它们的len()s,以及您尝试在substring()中使用的索引。现在仔细看看它们。结果可能令人惊讶! -
如果您将数据转换为可用的形式,查询会容易得多。您可以将数据转换为 XML 或 JSON,而不是原始文本。 SQL Server 自 2005 年起支持 XML,自 2016 年起支持 JSON。或者您可以添加计算列,根据您已经使用的公式返回各个字段。您可以通过将
:替换为" : ",将换行符替换为",并将结果包装在{ }中,将现有数据转换为 JSON。 -
预期输出为:对于列:注意 |结果 |主题 |持续时间测试说明 |安排面试 |安排会议 | 00:00:09
标签: sql sql-server string tsql split