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

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.xdnf.cn/news/18077.html

相关文章:

  • p5.js 3D盒子的基础用法
  • 【解决笔记】MyBatis-Plus 中无 selectList 方法
  • RK3588消费级8K VR一体机 是否有坑?
  • ABP vNext+ WebRTC DataChannel 低延迟传感推送
  • 《JMeter核心技术、性能测试与性能分析》 教学大纲及标准
  • JavaScript性能优化30招
  • Nacos-5--Nacos2.x版本的通信原理
  • C#---StopWatch类
  • 【开源大模型和闭源大模型分别有哪些?两者的对比?部署私有化模型的必要性有哪些?】
  • 五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化软件的部署
  • @Autowired @Resource IDE警告 和 依赖注入
  • 代码随想录刷题Day33
  • C#控制台输入(Read()、ReadKey()和ReadLine())
  • 关于simplifyweibo_4_moods数据集的分类问题
  • 企业级Spring事务管理:从单体应用到微服务分布式事务完整方案
  • 【CUDA 编程思想】FusedQKVProj-分组量化矩阵乘法高效实现全流程解析
  • IT资讯 | VMware ESXi高危漏洞影响国内服务器
  • 软考 系统架构设计师系列知识点之杂项集萃(123)
  • 怎样使用数据度量测试
  • Spring 条件注解与 SPI 机制(深度解析)
  • 社区物业HCommunity本地部署手册
  • 51单片机-驱动蜂鸣器模块教程
  • 力扣400:第N位数字
  • 我的学习认知、高效方法与知识积累笔记
  • 【Docker】搭建一个高性能的分布式对象存储服务 - MinIO
  • 国标调查:构建餐饮满意度动态优化体系,驱动体验价值升级​
  • Linux程序内存布局分析
  • rent8 安装部署教程之 Windows
  • Python采集微店商品详情 API 返回值说明,json数据返回
  • MySQL(多表查询练习)