Sql 获取oracle列中哪些特殊字符以及使用次数的列表
我正在寻找一种方法来获取特殊字符的列表,以及它们在我的专栏中出现的次数。我尝试过使用regexp\u count,但我不确定如何扩展它以使其在一个查询中适用于所有特殊字符 例如,对于syntax='x=y*100',我得到以下查询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 &
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。我无法复制您的问题,但我希望其中一个或两个可以解决您的问题。如果无法解决,则您可能需要发布表的说明和数据示例。您的更新版本运行良好。非常感谢