Sql 获取oracle列中哪些特殊字符以及使用次数的列表

Sql 获取oracle列中哪些特殊字符以及使用次数的列表,sql,oracle,count,special-characters,Sql,Oracle,Count,Special Characters,我正在寻找一种方法来获取特殊字符的列表,以及它们在我的专栏中出现的次数。我尝试过使用regexp\u count,但我不确定如何扩展它以使其在一个查询中适用于所有特殊字符 例如,对于syntax='x=y*100',我得到以下查询 select * from ( select regexp_count(syntax, '\*') as charCnt, syntax from tblTemp ) where charCnt &

我正在寻找一种方法来获取特殊字符的列表,以及它们在我的专栏中出现的次数。我尝试过使用regexp\u count,但我不确定如何扩展它以使其在一个查询中适用于所有特殊字符

例如,对于syntax='x=y*100',我得到以下查询

select *
  from (
         select regexp_count(syntax, '\*') as charCnt, syntax
           from tblTemp
       ) 
     where charCnt > 0
charCnt=1和syntax='x=y*100'

这是正确的,但我想回去

specChar Cnt

\*       1
=        1
etc..

Oracle安装程序

CREATE TABLE table_name(
  id INT,
  value NVARCHAR2(200)
);

INSERT INTO table_name
  SELECT 1, N'y=20x+3'          FROM DUAL UNION ALL
  SELECT 2, N'***^%$%$%*&*.&\?' FROM DUAL UNION ALL
  SELECT 3, UNISTR('\00B5\00B6\00B5')  FROM DUAL UNION ALL
  SELECT 4, N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()' FROM DUAL;

CREATE OR REPLACE TYPE CHAR_LIST IS TABLE OF CHAR(1 CHAR);
/
SELECT  t.id,
        --MAX( t.value ) AS value,
        CAST( c.COLUMN_VALUE AS CHAR(1 CHAR) ) AS character,
        COUNT(1) AS frequency
FROM    table_name t,
        TABLE(
          CAST(
            MULTISET(
              SELECT SUBSTR( t.value, LEVEL, 1 )
              FROM   DUAL
              WHERE  REGEXP_LIKE( SUBSTR( t.value, LEVEL, 1 ), '[^a-zA-Z0-9]' )
              CONNECT BY LEVEL <= LENGTH( t.value )
            ) AS CHAR_LIST
          )
        ) c
GROUP BY t.id, c.COLUMN_VALUE
ORDER BY id, character;
        ID CHARACTER  FREQUENCY
---------- --------- ----------
         1 +                  1 
         1 =                  1 
         2 $                  2 
         2 %                  3 
         2 &                  2 
         2 *                  5 
         2 .                  1 
         2 ?                  1 
         2 \                  1 
         2 ^                  1 
         3 µ                  2 
         3 ¶                  1 
         4 !                 20 
         4 "                 20 
         4 $                 20 
         4 %                 20 
         4 &                 20 
         4 (                 20 
         4 )                 20 
         4 *                 20 
         4 ^                 20 
         4 £                 20 
查询

CREATE TABLE table_name(
  id INT,
  value NVARCHAR2(200)
);

INSERT INTO table_name
  SELECT 1, N'y=20x+3'          FROM DUAL UNION ALL
  SELECT 2, N'***^%$%$%*&*.&\?' FROM DUAL UNION ALL
  SELECT 3, UNISTR('\00B5\00B6\00B5')  FROM DUAL UNION ALL
  SELECT 4, N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()' FROM DUAL;

CREATE OR REPLACE TYPE CHAR_LIST IS TABLE OF CHAR(1 CHAR);
/
SELECT  t.id,
        --MAX( t.value ) AS value,
        CAST( c.COLUMN_VALUE AS CHAR(1 CHAR) ) AS character,
        COUNT(1) AS frequency
FROM    table_name t,
        TABLE(
          CAST(
            MULTISET(
              SELECT SUBSTR( t.value, LEVEL, 1 )
              FROM   DUAL
              WHERE  REGEXP_LIKE( SUBSTR( t.value, LEVEL, 1 ), '[^a-zA-Z0-9]' )
              CONNECT BY LEVEL <= LENGTH( t.value )
            ) AS CHAR_LIST
          )
        ) c
GROUP BY t.id, c.COLUMN_VALUE
ORDER BY id, character;
        ID CHARACTER  FREQUENCY
---------- --------- ----------
         1 +                  1 
         1 =                  1 
         2 $                  2 
         2 %                  3 
         2 &                  2 
         2 *                  5 
         2 .                  1 
         2 ?                  1 
         2 \                  1 
         2 ^                  1 
         3 µ                  2 
         3 ¶                  1 
         4 !                 20 
         4 "                 20 
         4 $                 20 
         4 %                 20 
         4 &                 20 
         4 (                 20 
         4 )                 20 
         4 *                 20 
         4 ^                 20 
         4 £                 20 

Oracle安装程序

CREATE TABLE table_name(
  id INT,
  value NVARCHAR2(200)
);

INSERT INTO table_name
  SELECT 1, N'y=20x+3'          FROM DUAL UNION ALL
  SELECT 2, N'***^%$%$%*&*.&\?' FROM DUAL UNION ALL
  SELECT 3, UNISTR('\00B5\00B6\00B5')  FROM DUAL UNION ALL
  SELECT 4, N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()' FROM DUAL;

CREATE OR REPLACE TYPE CHAR_LIST IS TABLE OF CHAR(1 CHAR);
/
SELECT  t.id,
        --MAX( t.value ) AS value,
        CAST( c.COLUMN_VALUE AS CHAR(1 CHAR) ) AS character,
        COUNT(1) AS frequency
FROM    table_name t,
        TABLE(
          CAST(
            MULTISET(
              SELECT SUBSTR( t.value, LEVEL, 1 )
              FROM   DUAL
              WHERE  REGEXP_LIKE( SUBSTR( t.value, LEVEL, 1 ), '[^a-zA-Z0-9]' )
              CONNECT BY LEVEL <= LENGTH( t.value )
            ) AS CHAR_LIST
          )
        ) c
GROUP BY t.id, c.COLUMN_VALUE
ORDER BY id, character;
        ID CHARACTER  FREQUENCY
---------- --------- ----------
         1 +                  1 
         1 =                  1 
         2 $                  2 
         2 %                  3 
         2 &                  2 
         2 *                  5 
         2 .                  1 
         2 ?                  1 
         2 \                  1 
         2 ^                  1 
         3 µ                  2 
         3 ¶                  1 
         4 !                 20 
         4 "                 20 
         4 $                 20 
         4 %                 20 
         4 &                 20 
         4 (                 20 
         4 )                 20 
         4 *                 20 
         4 ^                 20 
         4 £                 20 
查询

CREATE TABLE table_name(
  id INT,
  value NVARCHAR2(200)
);

INSERT INTO table_name
  SELECT 1, N'y=20x+3'          FROM DUAL UNION ALL
  SELECT 2, N'***^%$%$%*&*.&\?' FROM DUAL UNION ALL
  SELECT 3, UNISTR('\00B5\00B6\00B5')  FROM DUAL UNION ALL
  SELECT 4, N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()'
            || N'!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()!"£$%^&*()' FROM DUAL;

CREATE OR REPLACE TYPE CHAR_LIST IS TABLE OF CHAR(1 CHAR);
/
SELECT  t.id,
        --MAX( t.value ) AS value,
        CAST( c.COLUMN_VALUE AS CHAR(1 CHAR) ) AS character,
        COUNT(1) AS frequency
FROM    table_name t,
        TABLE(
          CAST(
            MULTISET(
              SELECT SUBSTR( t.value, LEVEL, 1 )
              FROM   DUAL
              WHERE  REGEXP_LIKE( SUBSTR( t.value, LEVEL, 1 ), '[^a-zA-Z0-9]' )
              CONNECT BY LEVEL <= LENGTH( t.value )
            ) AS CHAR_LIST
          )
        ) c
GROUP BY t.id, c.COLUMN_VALUE
ORDER BY id, character;
        ID CHARACTER  FREQUENCY
---------- --------- ----------
         1 +                  1 
         1 =                  1 
         2 $                  2 
         2 %                  3 
         2 &                  2 
         2 *                  5 
         2 .                  1 
         2 ?                  1 
         2 \                  1 
         2 ^                  1 
         3 µ                  2 
         3 ¶                  1 
         4 !                 20 
         4 "                 20 
         4 $                 20 
         4 %                 20 
         4 &                 20 
         4 (                 20 
         4 )                 20 
         4 *                 20 
         4 ^                 20 
         4 £                 20 

您是否可以使用[![:alnum:]作为非字母数字,这是在使用字符类。我尝试过,它返回带有特殊字符的行,但计数似乎不正确。我还有另一个例子,比如syntax='(test>0)和(test2'1='抱歉不是这样!所以选择regexp_count('x=y*100','[^[:alnum:]'),因为dual中的charCnt给你一个值2。特殊的字符类是alnum、alpha、blank(空格和制表符)、cntrl(非打印或控制字符)、digit、graph(图形字符),print(可打印字符),punt(标点字符),space(空格字符,空格和换行符,换行符等),upper和xdigit(十六进制)你能用[![:alnum:]正如在非字母数字中一样,这使用的是字符类。我尝试过这样做,它返回带有特殊字符的行,但计数似乎不正确。我还有另一种情况,如语法='(test>0)和(test2“1=”很抱歉,它不是^not!所以选择regexp_count('x=y*100','[^[:alnum:]'))由于dual中的charCnt为您提供了2的值。特殊字符类有alnum、alpha、blank(空格和制表符)、cntrl(非打印或控制字符)、digital、graph(图形字符)、print(可打印字符)、punt(标点字符)、space(空格字符、空格、换行符和换行符等),上限和xdigit(十六进制)谢谢MT0。我将添加一个外部查询来计算频率,以便得到一个带有计数的字符的独特列表。我得到了这个错误,但我不确定是哪个类型的转换导致了它?它显示了许多行数据,然后我得到了错误。SQL错误:ORA-25137:数据值超出范围25137.00000-“数据值超出范围”*原因:强制转换操作数的值大于强制转换目标大小。*操作:增加强制转换目标的大小。@JerryWarra更新-将
cast(…强制转换(1))
更改为
cast(…强制转换(1个字符))
并将
SYS.ODCIVARCHAR2LIST
更改为UDT。我无法复制您的问题,但我希望其中一个或两个可以解决您的问题。如果无法解决,则您可能需要发布表的说明和数据示例。您的更新版本运行良好。非常感谢您MT0。我不打算这样做o添加一个外部查询来计算频率,这样我就可以得到一个带有计数的字符的不同列表。我得到了这个错误,但我不确定是哪个类型的转换导致了这个错误?它显示了许多行数据,然后我得到了错误。SQL错误:ORA-25137:数据值超出范围25137.00000-“数据值超出范围”*原因:强制转换操作数的值大于强制转换目标大小。*操作:增加强制转换目标的大小。@JerryWarra更新-将
cast(…强制转换(1))
更改为
cast(…强制转换(1个字符))
并将
SYS.ODCIVARCHAR2LIST
更改为UDT。我无法复制您的问题,但我希望其中一个或两个可以解决您的问题。如果无法解决,则您可能需要发布表的说明和数据示例。您的更新版本运行良好。非常感谢