【问题标题】:How to count number of words in delimited string in Oracle SQL如何计算Oracle SQL中分隔字符串中的单词数
【发布时间】:2015-11-15 07:23:58
【问题描述】:

例如,我有一个名为“Table1”的表。和名为“国家”的列。 我想计算字符串中单词的值。下面是我的“国家”列的数据:

country:
"japan singapore japan chinese chinese chinese"

预期输出:在上面的数据中,我们可以看到日本出现了两次,新加坡出现了一次,中文出现了 3 次。我想计算单词的值,其中日本为 1,新加坡为 1,中文为 1。因此输出将是 3。请帮助我

ValueOfWord: 3

【问题讨论】:

  • 您不应该在单个列中存储多个值。如果你正确地标准化你的模型,这是一个非常简单的查询。
  • 您是否将该字符串存储在单个条目中???
  • 是的。它在单个条目中我想计算单个条目字符串中每个单词的值
  • 将分隔字符串拆分为行,然后计算不同的。见Split single comma delimited string into rows in Oracle

标签: sql oracle count string-split csv


【解决方案1】:

首先,将多个值作为分隔字符串存储在单个列中是一种糟糕的设计。您应该考虑将数据规范化作为永久解决方案。

使用非规范化数据,您可以在单个 SQL 中使用 REGEXP_SUBSTR

SELECT COUNT(DISTINCT(regexp_substr(country, '[^ ]+', 1, LEVEL))) as "COUNT"
FROM table_name
  CONNECT BY LEVEL <= regexp_count(country, ' ')+1 
/

演示:

SQL> WITH sample_data AS
  2    ( SELECT 'japan singapore japan chinese chinese chinese' str FROM dual
  3    )
  4  -- end of sample_data mocking real table
  5  SELECT COUNT(DISTINCT(regexp_substr(str, '[^ ]+', 1, LEVEL))) as "COUNT"
  6  FROM sample_data
  7    CONNECT BY LEVEL <= regexp_count(str, ' ')+1
  8  /

     COUNT
----------
         3

请参阅Split single comma delimited string into rows in Oracle 以了解查询的工作原理。


更新

对于多个分隔字符串行,您需要注意由 CONNECT BY 子句形成的行数。

请参阅Split comma delimited strings in a table in Oracle 了解执行相同任务的更多方法。

设置

假设你有一个这样的 3 行表:

SQL> CREATE TABLE t(country VARCHAR2(200));

Table created.

SQL> INSERT INTO t VALUES('japan singapore japan chinese chinese chinese');

1 row created.

SQL> INSERT INTO t VALUES('singapore indian malaysia');

1 row created.

SQL> INSERT INTO t VALUES('french french french');

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM t;

COUNTRY
---------------------------------------------------------------------------
japan singapore japan chinese chinese chinese
singapore indian malaysia
french french french
  • 使用 REGEXP_SUBSTRREGEXP_COUNT

我们希望输出为 6,因为有 6 个唯一字符串。

SQL> SELECT COUNT(DISTINCT(regexp_substr(t.country, '[^ ]+', 1, lines.column_value))) count
  2    FROM t,
  3      TABLE (CAST (MULTISET
  4      (SELECT LEVEL FROM dual
  5              CONNECT BY LEVEL <= regexp_count(t.country, ' ')+1
  6      ) AS sys.odciNumberList ) ) lines
  7    ORDER BY lines.column_value
  8  /

     COUNT
----------
         6

还有许多其他方法可以实现所需的输出。让我们看看如何:

  • 使用 XMLTABLE
SQL> 选择计数(DISTINCT(国家))计数 2 从 3 (SELECT trim(COLUMN_VALUE) 国家 4 从吨, 5 xmltable(('"' 6 ||替换(国家,'','","') 7 || '"')) 8) 9 / 数数 ---------- 6
  • 使用MODEL子句
SQL> 与 2 模型参数 AS 3 ( 4 选择国家作为 orig_str , 5'' 6 ||国家 7 || ' ' 作为 mod_str , 8 1 作为开始位置, 9 长度(国家) AS end_pos , 10(长度(国家)- 11 LENGTH(REPLACE(country, ' '))) + 1 AS element_count , 12 0 AS element_no , 13 ROWNUM AS rn 14 从吨) 15 SELECT COUNT(DISTINCT(Substr(mod_str, start_pos, end_pos-start_pos))) 计数 16 从 ( 17 选择 * 18 来自模型参数 19 模型分区依据 (rn, orig_str, mod_str) 20 DIMENSION BY (element_no) 21 MEASURES (start_pos, end_pos, element_count) 22 条规则迭代 (2000) 23 直到 (ITERATION_NUMBER+1 = element_count[0]) 24 ( start_pos[ITERATION_NUMBER+1] = 25 instr(cv(mod_str), '', 1, cv(element_no)) + 1, 26 end_pos[ITERATION_NUMBER+1] = 27 instr(cv(mod_str), ' ', 1, cv(element_no) + 1) ) 28) 29 哪里 element_no != 0 30 按 mod_str 、 element_no 排序 31 / 数数 ---------- 6

【讨论】:

  • 这个查询工作正常,但是当应用于大量数据时它永远不会显示结果
  • 您对 sample_data 中字符串的演示,但我已经将数据存储在国家/地区列下的数据库中:record 1="japan singapore japan chinese chinese chinese" record 2="singapore indian malaysia" 我想要它计数包括记录 1 和记录 2 @Lalit Kumar B
  • @HaziqAzmi 我在更新中提供了完整的答案。请将其标记为已回答,会帮助其他人!
  • @HaziqAzmi 在我的答案的左上角,有一个向上箭头来支持答案。在它下面是一个勾号,点击它接受答案,当你接受它时它会变成绿色。
【解决方案2】:

您是否将这种字符串存储在单个条目中?

如果不行,试试

SELECT COUNT(*)
    FROM (SELECT DISTINCT T.country FROM Table1 T)

如果是,我会编写一个外部程序来解析字符串并返回你想要的结果。

喜欢使用java。

创建一个字符串集。

我将使用 JDBC 来检索记录,并使用 split 使用 ' ' 分隔符将字符串拆分为标记。对于每个标记,如果它不在集合中,则将其添加到集合中。

解析完成后,获取集合的长度,也就是你想要的值。

【讨论】:

  • 是的..单个条目中的字符串。它就像长字符串.. “japan singapore japan chinese chinese chinese chinese” 表示为第 1 行
  • 我认为这并不容易查询.. 通常人们会在字符串中计算某个单词。例如:SELECT (LENGTH(QUESTION_ITEM) - LENGTH(REPLACE(QUESTION_ITEM,'EXPLAIN')))/LENGTH('EXPLAIN') FROM CLASSIFY
  • 请告诉我解析字符串并返回结果的外部程序
  • 这不能回答 OP 的问题。请记住,如果你可以在SQL 中进行,那么在SQL 中进行,如果没有,在PL/SQL 中进行,如果在JAVA 中进行,如果在C 中进行。在 OP 的情况下,它可以在纯 SQL 中完成。
【解决方案3】:

根据空格分隔符分断字符串

SELECT COUNT(DISTINCT regexp_substr(col, '[^ ]+', 1, LEVEL))
  FROM T
CONNECT BY LEVEL <= regexp_count(col, ' ')+1

用于计算 DISTINCT 单词

    SELECT col,
COUNT(DISTINCT regexp_substr(col, '[^ ]+', 1, LEVEL))
  FROM T
CONNECT BY LEVEL <= regexp_count(col, ' ')+1
GROUP BY col

FIDDLE

【讨论】:

  • 这并不能真正回答 OP 的问题。您正在返回每个单词的计数,但是,OP 想要不同的计数。此外,不需要trim,因为您只需要计数。
猜你喜欢
  • 2012-12-10
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多