SQL Server 计算数组中的所有元素

35g0bw71  于 2023-01-08  发布在  其他
关注(0)|答案(3)|浏览(216)

我有一个表,我保存一些数据,包括数字列表。
像这样:
| 数字|
| - ------|
| (无)|
| 42593|
| 42593 42594 36725 42592 36725 42592|
| 42593恩42594恩36725恩42592|
| 31046 36725 42592|
我想计算SQL Server中每行的元素数
| 计数|
| - ------|
| 无|
| 1个|
| 六个|
| 四个|
| 三个|

ctehm74n

ctehm74n1#

您可以使用替换技巧:

SELECT numbers,
       COALESCE(LEN(numbers) - LEN(REPLACE(numbers, ',', '')), 0) AS num_elements
FROM yourTable;

上述技巧通过计算逗号的数量来实现(假设您的数据确实使用逗号作为分隔符)。例如,您的最后一个样本数据点是:

,31046,36725,42592 => length is 18
310463672542592    => length is 15

因此,长度上的差异正确地产生了正确数量的元素。

uttx8gqw

uttx8gqw2#

您的数据

CREATE TABLE yourtable(
   numbers VARCHAR(max) 
);
INSERT INTO yourtable
(numbers) VALUES 
(null),
('،42593'),
('،42593،42594،36725،42592،36725،42592'),
('،42593،42594،36725،42592'),
('،31046،36725،42592');

您需要ISNULLlen

select 
ISNULL(len(numbers) - len(replace(numbers,'،','')) ,0)  count
from yourtable

另一种方式是如下使用IIFstring_split

SELECT IIF(count < 0, 0, count) count
FROM   (SELECT (SELECT Count(*) - 1
                FROM   STRING_SPLIT (Replace(Replace(numbers, 'R', ''), '،',
                                     'R'), 'R'
                       )) AS
               'count'
        FROM   yourtable) A

dbfiddle

bf1o4zei

bf1o4zei3#

另一个想法是使用STRING_SPLIT

SELECT  y.numbers, 
(SELECT COUNT(Value) - 1
FROM string_split(COALESCE(y.numbers,''),',')) AS num_elements
FROM yourtable AS y;

我知道第一眼看上去有点不方便,因为第二行中有奇怪的-1,第三行中有COALESCE
在您的情况下,在我的查询中导致这些困难的奇怪的事情是您的行总是以逗号开头。
这是相当奇怪的,如果每行没有第一个逗号会容易得多。
让我们假设你在未来删除这个逗号,那么这将变得非常容易和良好的可读性:

SELECT  y.numbers, 
(SELECT COUNT(Value)
FROM string_split(y.numbers,',')) AS num_elements
FROM yourtable AS y;

试用:db<>fiddle

相关问题