0

我正在使用以下查询:

SELECT 
  CURRENT_AFFAIRS_ID,
  IMPORTANT_EXAM 
FROM CURRENT_AFFAIRS_LANGUAGE 
WHERE CURRENT_AFFAIRS_ID IN (
  1362544236,
  1363764599,
  1363670667,
  1363516827,
  1363500146)  
AND IMPORTANT_EXAM IS NOT NULL 
AND IS_ACTIVE = 1 
AND IS_DELETED = 0

显示以下数据:

1363764599  Civil Services Exam, SSC Exams
1363670667  Bank Exams, SSC Exams
1363516827  Bank Exams, Civil Services Exam, SSC Exams
1363500146  Civil Services Exam, SSC Exams

我的要求是计算以逗号分隔的字符串的出现次数(例如公务员考试)

我试图通过java编码来做到这一点。

但这似乎太复杂的工作。

是否可以使用 oracle 或数据库端的任何功能?

4

2 回答 2

3

从 11g 起,您可以尝试REGEXP_COUNT

SELECT 
  CURRENT_AFFAIRS_ID,
  IMPORTANT_EXAM ,
  regexp_count(IMPORTANT_EXAM , '[^,]+')
FROM CURRENT_AFFAIRS_LANGUAGE 
WHERE CURRENT_AFFAIRS_ID IN (
  1362544236,
  1363764599,
  1363670667,
  1363516827,
  1363500146)  
AND IMPORTANT_EXAM IS NOT NULL 
AND IS_ACTIVE = 1 
AND IS_DELETED = 0

这是一个 sqlfiddle 演示

于 2013-05-28T10:36:44.423 回答
1

作为一个快速和肮脏的选项,您可以使用regexp_replace删除字符串中除逗号之外的所有内容,计算它们并添加一个。假设字符串格式正确。

SELECT 
  CURRENT_AFFAIRS_ID,
  IMPORTANT_EXAM,
  LENGTH(regexp_replace(IMPORTANT_EXAM, '[^,]', '')) + 1 AS EXAMS
FROM CURRENT_AFFAIRS_LANGUAGE 
WHERE CURRENT_AFFAIRS_ID IN (
  1362544236,
  1363764599,
  1363670667,
  1363516827,
  1363500146)  
AND IMPORTANT_EXAM IS NOT NULL 
AND IS_ACTIVE = 1 
AND IS_DELETED = 0;

SQL 小提琴

编辑:如果你在 11g 上,那就regexp_count更好了,如 ABCade 所示 - 如果可以的话,使用它。这个regexp_replace选项将从 10g 开始工作,所以我暂时把它留在这里......

不过,我不确定您为什么要在一个字符串中存储多个值。您应该将考试移动到一个单独的表中,然后有一个映射表来显示哪些考试以哪些语言提供。

于 2013-05-28T10:42:11.983 回答