【发布时间】:2016-10-04 11:34:28
【问题描述】:
我有一个包含逗号分隔字符串的字段的表。我想创建返回以下结果的查询:
我想创建返回拆分文本的查询。例如:
表格中的数据:
| ID | Names |
| ------------------------------------ | -------------------------------- |
| 63F5D993-3AC9-4EEA-8007-B669542BAD9A | John Smith,Kerry King,Tom Arraya |
要求的结果:
ID | Names
------------------------------------ | -----------
63F5D993-3AC9-4EEA-8007-B669542BAD9A | John Smith
------------------------------------- | -----------
63F5D993-3AC9-4EEA-8007-B669542BAD9A | Kerry King
------------------------------------- | -----------
63F5D993-3AC9-4EEA-8007-B669542BAD9A | Tom Arraya
我找到了 T-SQL 的“拆分”功能,但它的工作原理并不完全适合我的情况。我不能这样执行:
SELECT dbo.Split(dbo.name, ',') FROM dbo.Mytable
它只能执行如下:
SELECT * FROM dbo.Split('John Smith,Kerry King,Tom Arraya', ',')
但它不适合我。 我也尝试写光标:
DECLARE @bkb varchar(256)
DECLARE @Bkb_Cursor CURSOR
SET @Bkb_Cursor = CURSOR SCROLL FOR
SELECT bkb.best_know_by
FROM [sugarcrm_cmsru_dev].[dbo].[contacts] c
left JOIN [dbo].[email_addr_bean_rel] eb
ON eb.[bean_id] = c.[id]
JOIN [dbo].[email_addresses] ea
ON ea.[id] = eb.[email_address_id]
JOIN [dbo].[contacts_cstm] ccs
ON eb.bean_id = ccs.id_c
left JOIN [dbo].[BestKnowBy$] bkb
ON c.[campaign_id] =bkb.Con_id
where c.deleted = 0;
OPEN @Bkb_Cursor;
FETCH NEXT FROM @Bkb_Cursor
INTO @bkb;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT dbo.Splitfn(@bkb);
FETCH NEXT FROM @Bkb_Cursor INTO @bkb;
END
CLOSE @Bkb_Cursor;
DEALLOCATE @Bkb_Cursor;
GO
但它不起作用。我收到错误“此上下文中不允许列“dbo”,并且找不到用户定义的函数或聚合“dbo.Splitfn”。”
我该如何解决这个问题?
我的查询如下所示:
SELECT c.[id],
bkb.best_know_by
FROM [sugarcrm_cmsru_dev].[dbo].[contacts] c
left JOIN [dbo].[email_addr_bean_rel] eb
ON eb.[bean_id] = c.[id]
JOIN [dbo].[email_addresses] ea
ON ea.[id] = eb.[email_address_id]
JOIN [dbo].[contacts_cstm] ccs
ON eb.bean_id = ccs.id_c
left JOIN [dbo].[BestKnowBy$] bkb
ON c.[campaign_id] =bkb.Con_id
where c.deleted = 0;
bkb.best_know_by 字段包含逗号分隔的字符串。在这种情况下如何使用“交叉申请”?
【问题讨论】:
-
我认为您的查询中的联接是错误的,因为
ea和eb之间的INNER JOIN意味着c和eb之间的INNER JOIN。由于您使用了LEFT OUTER JOIN到bkb,因此您可能希望使用OUTER APPLY而不是CROSS APPLY。OUTER APPLY的行为类似于LEFT OUTER JOIN,这意味着即使函数本身没有返回行,也会返回行(函数返回的列将输出为 NULL)。CROSS APPLY表示INNER JOIN,因此只有在函数中存在对应行时才会返回行。
标签: sql sql-server tsql split