当前位置: 首页 > news >正文

Oracle按照特定列值排序和C#统计特定列值的所有行

1、数据源

Oracle 表 ID,TEST_ITEM 数据如下

IDTEST_ITEM
1通孔孔铜
2表面铜厚1
3表面铜厚2
4L02
5L03
6线面实测
7线角实测
8L01-L02
9L02-L03
10L03-L04

2、Oracle实现如下需求

要想让表面铜厚1 排在L02,L03的前面,表面铜厚2 排在L02,L03的后面
在 Oracle SQL 中,要按照 “表面铜厚1” 排在 “L02”、“L03” 前面,而 “表面铜厚2” 排在 “L02”、“L03” 后面 的顺序排序,可以使用 CASE WHEN 语句自定义排序优先级。以下是实现方法:

SQL 排序方案

SELECT ID, TEST_ITEM
FROM your_table
ORDER BY CASE WHEN TEST_ITEM = '表面铜厚1' THEN 1       -- 表面铜厚1 排最前WHEN TEST_ITEM IN ('L02', 'L03') THEN 2   -- L02/L03 排中间WHEN TEST_ITEM = '表面铜厚2' THEN 3       -- 表面铜厚2 排后面ELSE 4                                    -- 其他项默认排序END,ID;  -- 相同优先级时按ID排序

执行结果示例

IDTEST_ITEM
2表面铜厚1
4L02
5L03
3表面铜厚2
1通孔孔铜
6线面实测
7线角实测
8L01-L02
9L02-L03
10L03-L04

关键点说明

  1. 优先级控制

    • 表面铜厚1 → 优先级 1(最前)
    • L02/L03 → 优先级 2(中间)
    • 表面铜厚2 → 优先级 3(后面)
    • 其他项 → 优先级 4(按原始顺序)
  2. 次级排序
    ID 作为第二排序条件,确保相同优先级的记录按插入顺序排列。

  3. 扩展性
    如需处理更复杂的规则(如 L01-L02 需单独排序),可扩展 CASE WHEN 条件:

    CASE WHEN TEST_ITEM = '表面铜厚1' THEN 1WHEN TEST_ITEM LIKE 'L%' AND TEST_ITEM NOT LIKE '%-%' THEN 2  -- 仅匹配L02/L03WHEN TEST_ITEM = '表面铜厚2' THEN 3ELSE 4
    END
    

此方案灵活满足定制化排序需求,同时保持代码清晰易维护。

3、C#统计特定列值的所有行

在 C# 中统计 DataTable 中类似 L02L03 格式的行数(即 L 开头 + 数字结尾),可通过以下方法实现:


方法 1:使用 DataView 正则过滤(推荐)

using System.Data;
using System.Text.RegularExpressions;DataTable dt = GetYourDataTable(); // 假设已加载数据// 正则匹配 L + 数字(如 L02、L03、L99)
DataView dv = new DataView(dt);
dv.RowFilter = "REGEX_LIKE(TEST_ITEM, '^L\\d+$')"; // 需自定义函数(见下方补充说明)int count = dv.Count;
Console.WriteLine($"L开头数字结尾的行数: {count}");

补充说明
DataView 原生不支持正则,需通过 DataTableSelect 方法或遍历实现正则匹配(见方法2)。


方法 2:遍历 + 正则匹配(通用)

int count = 0;
Regex regex = new Regex(@"^L\d+$"); // 匹配 L + 数字foreach (DataRow row in dt.Rows)
{if (regex.IsMatch(row["TEST_ITEM"].ToString())){count++;}
}Console.WriteLine($"L开头数字结尾的行数: {count}");

方法 3:LINQ + 正则(简洁版)

using System.Linq;int count = dt.AsEnumerable().Count(row => Regex.IsMatch(row.Field<string>("TEST_ITEM"), @"^L\d+$"));
Console.WriteLine($"L开头数字结尾的行数: {count}");

输出示例

若数据包含:

  • L02L03L04L01-L02(不符合)、表面铜厚1(不符合)

结果

L开头数字结尾的行数: 3

扩展:统计特定范围(如 L01-L99)

Regex regex = new Regex(@"^L(0[1-9]|[1-9]\d)$"); // 匹配 L01-L99
int count = dt.AsEnumerable().Count(row => regex.IsMatch(row.Field<string>("TEST_ITEM")));

关键点

  1. 正则表达式
    • ^L\d+$:严格匹配 L + 1个或多个数字。
    • 排除 L01-L02 这类复合值(需调整正则逻辑)。
  2. 性能:大数据量时推荐 DataView 或索引优化。

根据需求选择最适合的方案即可!

http://www.dtcms.com/a/333447.html

相关文章:

  • 数据结构:N叉树 (N-ary Tree)
  • 【部署K8S集群】 1、安装前环境准备配置
  • Deepoc具身智能模型如何重塑康复辅助设备
  • Java中MybatisPlus使用多线程多数据源失效
  • 集成电路学习:什么是Image Segmentation图像分割
  • 功能组和功能组状态的概念关系和区别
  • java16学习笔记-Vector API
  • oracle数据库初始化
  • 共探头部设计|安贝斯携手武汉科创协会x深钣协“湖北行”,链动D+M小镇的华中范式
  • Linux软件编程-进程(2)及线程(1)
  • 快速设计简易嵌入式操作系统(5):贴近实际场景,访问多外设,进一步完善程序
  • WPF 监控CPU、内存性能
  • python math数学运算模块
  • 【AI论文】Story2Board:一种无需训练的富有表现力故事板生成方法
  • Numerical Difference between vLLM logprobs and huggingface logprobs
  • windows下hashcat使用gpu破解execl打开密码
  • 深入Amazon DynamoDB:高效、无缝的数据存储解决方案
  • 项目生命周期
  • Python爬虫大师课:HTTP协议深度解析与工业级请求封装
  • k8s环境使用Operator部署Seaweedfs集群(一)
  • STM32传感器模块编程实践(十四)DIY语音+满溢检测智能垃圾桶模型
  • SD-WAN核心特点有哪些,适用哪些场景?
  • Rust 入门 泛型和特征-深入特征 (十五)
  • 【Cuda 编程思想】LinearQaunt-分块量化矩阵乘法计算过程
  • 关系型数据库核心组件:视图、函数与存储引擎详解
  • 分布式锁那些事
  • 机器学习中的PCA降维
  • ubuntu 20.04 搭建多用户远程桌面共享及同时在线使用
  • langGraph--2--langServe+langGraph示例
  • 云原生俱乐部-k8s知识点归纳(3)