【问题标题】:Repeating values in single-column table单列表中的重复值
【发布时间】:2018-02-23 15:30:01
【问题描述】:

我知道这个标题不是最好的,但我想不出更好的。

我有一个类似于 STRING_SPLIT() 的函数,它返回一个单列表,每次拆分一行。我需要做的是在新行中保持其他列的值相同。

我有一个 #TEMP 表,其中包含许多行,如下所示:

INSERT INTO #TEMP([A], [ToSplit], [C], [D]) SELECT '549618', 'AAA, BBB', '1.7', '6'

我想将该行变成两行,一行为AAA,另一行为BBB,其他值保持相等。

我在选择列表中试过了:

SELECT *, (SELECT * FROM [dbo].[ufn_split](ToSplit,',')) FROM #TEMP

错误:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

然后作为条件(我使用 IN 因为它是唯一允许子查询的):

SELECT A, ToSplit FROM #TEMP 
WHERE ToSplit IN (SELECT * FROM [dbo].[ufn_split](ToSplit,','))

没有错误,但它只返回不需要拆分的行。它只适用于 LIKE,这是不允许的。

所以我尝试在方法中放置一个子查询来创建一个单列表,每行有一个拆分值,我会逐行进行,在#TEMP 上使用 `LIKE %ToSplit%,但同样,子查询不是允许。

SELECT * FROM [dbo].[ufn_split]((SELECT ToSplit FROM #TEMP),',')

错误:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

我的问题是,如何拆分 ToSplit 中的值并保留其他列的值?

【问题讨论】:

标签: sql-server tsql split


【解决方案1】:

请像这样尝试。使用 CROSS APPLY

SELECT *
FROM #TEMP 
CROSS APPLY
(
    SELECT * FROM [dbo].[ufn_split](ToSplit,',')
)u 

【讨论】:

  • 您的回答似乎对我有用。您能否进一步详细说明它为什么起作用?也许编辑问题?无论如何我都会接受它作为答案,但它可能会更清楚。
  • Apply 运算符仅用于此目的。您可以从technet.microsoft.com/en-us/library/ms175156(v=sql.105).aspx 阅读更多内容。它的作用是为每个外部值调用间隔子查询。我们还可以在查询中提供 where 子句。这实际上是我在 SQL Server 中最喜欢的东西之一。
【解决方案2】:

这将适用于 SQL SERVER 2016 并具有无限的价值。

SELECT
  t.*, LTRIM([value])
FROM #TEMP t
CROSS APPLY string_split([ToSplit], ',')

【讨论】:

  • 您的查询确实有效。您能否进一步详细说明它的工作原理和原因?看起来很简单。它如何知道CROSS APPLY 结果适合的位置?
  • 你好,把CROSS APPLY想象成一个逐行的INNER JOIN,但是ON条件变成了子查询中的WHERE条件。在这种情况下,没有 WHERE 将应用拆分的结果。字符串拆分函数将是拆分 ToSplit 列的第二个表。希望对您有所帮助。
猜你喜欢
  • 2014-09-05
  • 1970-01-01
  • 2021-06-11
  • 2019-05-07
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
相关资源
最近更新 更多