我想使用Oracle的regexp_like只允许以下操作:

  • 字母D或T
  • 任何数字,包括小数和负数
  • 特殊字符管道|

非常感谢您的意见:)

Following are valid lines

D|1005433608369|202311220039403004157|2023112200394030041570002|0|-53|4157|20231122|30|394|820|2|0|0|0|0
D|1006233842021|202311220039403004160|2023112200394030041600001|1|0|4160|20231122|30|394|868|1|46002136|98|35|0
D|1006233842021|202311220039403004160|2023112200394030041600002|0|-63|4160|20231122|30|394|820|2|0|0|0|0
D|1004420222359|202311220039403004161|2023112200394030041610001|1|0|4161|20231122|30|394|868|1|45941436|108|54|0
D|1004420222359|202311220039403004161|2023112200394030041610002|0|-54|4161|20231122|30|394|820|2|0|0|0|0
D|1005557156227|202311220039403004187|2023112200394030041870001|1|0|4187|20231122|30|394|868|1|46189226|98|2

Following is an invalid line

T|2401|20231124|202311240240138702117|1015453705|5|193|00 A+%?Pu?Z?3<???

推荐答案

您可以使用以下正则表达式模式:

^(-?[0-9]+(\.[0-9]+)?|[DT])(\|(-?[0-9]+(\.[0-9]+)?\|[DT]))*$

-Oracle查询:

SELECT val
FROM yourTable
WHERE REGEXP_LIKE(val, '^(-?[0-9]+(\.[0-9]+)?|[DT])(\|(-?[0-9]+(\.[0-9]+)?|[DT]))*$');

演示

此正则表达式模式表示匹配:

  • 从第一行开始算起^
  • (
    • -?可选的前导负号
    • [0-9]+(\.[0-9]+)?整数或小数
    • ||
    • [DT]字母DT
  • )个个
  • (
    • \|管分离器
    • (
      • -?可选的前导负号
      • [0-9]+(\.[0-9]+)?整数或小数
      • \|\|
      • [DT]字母DT
    • )个个
  • )*竖线THEN数字/字母表达式零或更多次
  • $结束这条线

Sql相关问答推荐

当有空单元格时,如何连接列

GROUP BY与多个嵌套查询T—SQL

SQL将 Select 查询作为新列添加到另一个 Select 查询

解析SQL Server中的嵌套JSON

冲突查询的UPDATE时违反非空约束

按连续相等值分组排序

SQL:查询作为子查询或CTE写入的最大和数失败

TSQL如何为群分配号码

此过程如何在不引用传递的参数值的情况下执行工作?

如何使子查询在UPDATE语句期间获得最新更新

如何使用聚合连接两个表

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

使用 union 的有序结果获取行数

SQL根据另一列的顺序和值获取组中的最后一列

根据行号将列转置为没有任何id或键列的行

HIVE SQL where 子句未按预期工作

在 SQL 中使用循环遍历按时间顺序排列的数据

使用SQL中另一个表的查询结果在表中查找记录

在 SQL 的每行选项中 Select 最大值

删除具有相同 ID 的重复记录 - Postgresql