SQL Server 2008中解析Remark字段并与TotalBookedFare列值对比求助
解决SQL Server 2008中解析Remark字段提取票价的问题
我来帮你搞定这个问题~在SQL Server 2008里确实没有高版本那些好用的字符串函数,不过咱们用基础函数也能搞定Remark里的票价提取和对比。
先明确核心思路
咱们的目标是从Remark字符串中间揪出票价,然后和TotalBookedFare列做对比。首先得根据Remark的实际格式来选提取方法,我给你两种通用方案,你可以根据自己的数据调整:
方案一:如果票价前后有固定标识(比如特定字符串分隔)
如果你的Remark是类似"订单信息:票价150.00 | 乘客:张三"这种,票价前后有固定的分隔字符,那用CHARINDEX定位分隔符,再用SUBSTRING截取就行:
SELECT TotalBookedFare, Remark, -- 提取中间的票价(这里假设票价前是"票价",后是"|",你要换成自己的实际分隔符) LTRIM(RTRIM(SUBSTRING( Remark, CHARINDEX('票价', Remark) + LEN('票价'), -- 找到"票价"的位置,往后跳对应长度 CHARINDEX('|', Remark) - CHARINDEX('票价', Remark) - LEN('票价') -- 计算要截取的长度 ))) AS ExtractedFare, -- 直接对比数值(注意转成相同类型,避免字符串对比的坑) CASE WHEN TotalBookedFare = CAST(LTRIM(RTRIM(SUBSTRING( Remark, CHARINDEX('票价', Remark) + LEN('票价'), CHARINDEX('|', Remark) - CHARINDEX('票价', Remark) - LEN('票价') ))) AS DECIMAL(18,2)) THEN '匹配' ELSE '不匹配' END AS MatchResult FROM YourTableName; -- 替换成你的表名
方案二:如果票价是字符串里唯一的金额格式数值
如果Remark里只有一个带小数的数值(比如其他数字是订单号、人数,只有票价是xx.xx格式),那用PATINDEX匹配数字模式来提取:
SELECT TotalBookedFare, Remark, -- 提取带小数点的数值 SUBSTRING( Remark, PATINDEX('%[0-9.]%', Remark), -- 找到第一个数字或小数点的位置 PATINDEX('%[^0-9.]%', SUBSTRING(Remark, PATINDEX('%[0-9.]%', Remark), LEN(Remark))) - 1 -- 找到数值结束的位置 ) AS ExtractedFare, -- 数值对比 CASE WHEN TotalBookedFare = CAST(SUBSTRING( Remark, PATINDEX('%[0-9.]%', Remark), PATINDEX('%[^0-9.]%', SUBSTRING(Remark, PATINDEX('%[0-9.]%', Remark), LEN(Remark))) - 1 ) AS DECIMAL(18,2)) THEN '匹配' ELSE '不匹配' END AS MatchResult FROM YourTableName;
要是你的票价都是两位小数,还可以把PATINDEX('%[0-9.]%', Remark)改成PATINDEX('%[0-9][0-9].[0-9][0-9]%', Remark),匹配更精准。
针对第一行不匹配的情况
你说第一行不匹配,大概率是这行的Remark格式和其他行不一样。你可以先单独查一下这行的内容:
SELECT Remark FROM YourTableName WHERE TotalBookedFare != (这里放你用上面方法提取的票价);
找到格式差异后,用CASE语句分情况处理就行,比如:
SELECT TotalBookedFare, Remark, -- 分格式提取票价 CASE WHEN Remark LIKE '第一行的特殊格式%' THEN SUBSTRING(Remark, 10, 6) -- 替换成对应位置和长度 ELSE LTRIM(RTRIM(SUBSTRING(Remark, CHARINDEX('票价', Remark)+2, ...))) -- 普通格式的提取逻辑 END AS ExtractedFare, -- 对比结果 CASE WHEN TotalBookedFare = CAST(CASE WHEN Remark LIKE '第一行的特殊格式%' THEN SUBSTRING(Remark, 10, 6) ELSE LTRIM(RTRIM(SUBSTRING(Remark, CHARINDEX('票价', Remark)+2, ...))) END AS DECIMAL(18,2)) THEN '匹配' ELSE '不匹配' END AS MatchResult FROM YourTableName;
几个要注意的点
- SQL Server 2008没有
TRIM()函数,所以要用LTRIM(RTRIM())来去掉提取出的票价前后的空格。 - 一定要把提取到的字符串转换成和TotalBookedFare相同的数据类型(比如DECIMAL)再对比,不然像
"100"和"100.00"字符串对比会显示不匹配,但数值是相等的。 - 如果Remark格式特别杂,可能需要多写几个
CASE分支,或者先把不同格式的数据分类处理。
内容的提问来源于stack exchange,提问作者bennett
相关产品推荐
相关产品推荐

