我想ROW_NUMBER
在cte中提供一个能够从具有给定索引(如array-indexer
arr[index]
)的序列中选择特定项目的功能。当然,“序列”是一个来自表值函数(Split
)的表。
那么如何在索引不可用时创建索引呢?这是查询:
DECLARE @string VARCHAR(100);
SET @string='field1;field2;field3;field4;field5;field6;field7';
DECLARE @index INT;
SET @index = 4;
WITH cte
AS (SELECT item,
rn=Row_number()
OVER(
ORDER BY item)
FROM dbo.Split(@string, ';'))
SELECT TOP 1 item
FROM cte
WHERE rn = @index
Row_number() OVER(ORDER BY item)
按字母顺序排序,但实际上我想按(不可用)索引排序。
请注意,这个问题是我对这个问题的回答引起的。
当然,您只需要跟踪每个项目在列表中的显示位置即可。一种方法是让您的拆分函数插入一IDENTITY
列。以我的回答从你引用的问题:
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS @t TABLE([Index] INT IDENTITY(1,1), Item NVARCHAR(255))
AS
BEGIN
INSERT @t(Item) SELECT SUBSTRING(@List, Number,
CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects) AS n(Number)
WHERE Number <= CONVERT(INT, LEN(@List))
AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
ORDER BY Number OPTION (MAXDOP 1);
RETURN;
END
GO
DECLARE @x TABLE(i INT, string NVARCHAR(4000));
INSERT @x SELECT 1, N'field1;field2;field3;field4;field5;'
UNION ALL SELECT 2, N'x;y;6;r;3;2;w;'
UNION ALL SELECT 3, N'ttt;444;rrr;333;111;444;777;888;';
SELECT x.i, s1.Item
FROM @x AS x
CROSS APPLY dbo.SplitStrings(x.string, ';') AS s1
WHERE s1.[Index] = 4;
内联替代方案,在规模上 可能 会 稍微 友好一些:
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
AS
RETURN (SELECT [Index] = ROW_NUMBER() OVER (ORDER BY Number),
Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number,
CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)))
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects) AS n(Number)
WHERE Number <= CONVERT(INT, LEN(@List))
AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter
) AS y);
GO
当然,最终您将需要修复架构。如果此列表中的第4个元素是重要数据,则应将其单独存储。
我想用Java中所有可能的方法将一个列表拆分为给定数量的n个子列表。 例如,其中n=3将包括以下列表(但不是一个完整的解决方案-完成将需要更多的空间): 等 我适应了另一个类似的问题的解决方案(以所有可能的方式将列表分割成两个子列表),但它只适用于创建2个子列表的列表,我正在努力掌握如何实现灵活而不是硬编码的子列表数量。 这是我的密码: 我需要创建n个数的EGroup对象添加到,而不是硬编码的2,
我有很多这样的字符串: 我想拆分这些字符串,使其如下所示: 然后,这些将被添加到数据集中并在以后进行分析。 我遇到的问题是,如果我使用以下代码: 它会将它们分裂两次;我只想在第二次出现:时将其拆分一次。 我该怎么做呢?
如何使用流将Java列表拆分为Java大小为的较小列表? 在JavaScript中,我会使用函数并执行如下操作: 我试图用Java流来实现这一点,但我似乎不知道如何让它允许我使用数组列表
问题内容: 如果我们在python中有一个,并且想要基于一些特殊的条件创建子列表,我们应该怎么做? 例如: 会产生: 问题答案: itertools.groupby是一种方法(通常是这样): 由于这种特殊情况,我们甚至可以作弊:
本文向大家介绍在Python中拆分自定义列表,包括了在Python中拆分自定义列表的使用技巧和注意事项,需要的朋友参考一下 数据分析引发了复杂的场景,在这些场景中,数据需要整理才能移动。在这种情况下,让我们看看如何根据需要将一个大列表分成多个子列表。在本文中,我们将探讨实现这一目标的方法。 带拉链和for环 在这种方法中,我们使用列表切块从必须进行分割的位置获取元素。然后,我们使用zip和for循
我有多行这样的代码,我试图将它们拆分并添加到3个不同的列表中。“~”将它们分开。 姓名~年龄~单词 姓名~年龄~单词 我用下面的代码将其拆分。 我有ArrayList年龄,ArrayList名字,ArrayList。。。。 当我进行拆分[0]时,它确实有效,并给出了名称。 但是当我做分裂[1]的时候,它会给我一个断点错误。 有什么帮助吗?你能给我推荐一个更好的方法吗?