当前位置: 首页 > 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.lryc.cn/news/621595.html

相关文章:

  • 当云手机出现卡顿怎么办?
  • 云手机选哪个比较好用?
  • 手机端的音视频界面或者图片文档界面共享给大屏
  • 实用技巧:Oracle中精准查看表占用空间大小
  • Rust 中 i32 与 *i32 的深度解析
  • Java-JVM的内存模型
  • 网上商城|基于SprinBoot+vue的分布式架构网上商城系统(源码+数据库+文档)
  • 【学习笔记】进程、线程、协程及进程间通信
  • 电脑开机几秒后就停止然后再循环是怎么回事
  • 深入理解 Python 闭包:从原理到实践
  • 永磁同步电机控制 第二篇、电机的分类
  • web学习笔记6
  • 使用原生css实现word目录样式,标题后面的...动态长度并始终在标题后方(生成点线)
  • 硬件开发_基于STM32单片机的热水壶系统
  • 数据结构初阶:排序算法(一)插入排序、选择排序
  • 宋红康 JVM 笔记 Day02|JVM的架构模型、生命周期、发展历程
  • 46.Sentinel规则持久化
  • mlir clone
  • week1-[循环嵌套]画正方形
  • cloudflare缓存配置
  • AAAI爆款:目标检测新范式,模块化设计封神之作
  • StarRocks数据库集群的完整部署流程
  • JavaScript性能优化30招
  • 【车联网kafka】常用参数及其命令总结(第八篇)
  • 计算机网络:(十五)TCP拥塞控制与TCP拥塞控制算法
  • es7.x的客户端连接api以及Respository与template的区别
  • Notepad++插件开发实战指南
  • 【详细操作指南】如何将 Moodle 与编辑器连接,以修改文档、检查和批改作业等
  • HTTP/2新型漏洞“MadeYouReset“曝光:可发动大规模DoS攻击
  • HTTP 请求方法:GET 与 POST