如何利用SUBSTRING_INDEX提取@initials与后续首个@initialsE间的字符串?
解决用SUBSTRING_INDEX提取指定分隔符首次出现区间字符串的问题
问题分析
你当前的SQL逻辑存在偏差:内层SUBSTRING_INDEX(sales_order_item.product_options,@initialsE,1)是截取整个字符串到**第一个@initialsE**的片段,但这个@initialsE可能出现在@initials之前,导致提取结果完全不符合预期。我们需要先定位到第一个@initials的位置,再提取它之后首个@initialsE之间的目标内容。
修正后的SQL语句
SET @initials := 'appear)","value":"'; SET @initialsE := '"'; SELECT sales_order_item.product_options, -- 先截取@initials之后的所有内容,再提取到首个@initialsE之前的部分 SUBSTRING_INDEX( SUBSTRING(sales_order_item.product_options, LOCATE(@initials, sales_order_item.product_options) + LENGTH(@initials)), @initialsE, 1 ) AS `Name` FROM sales_order_grid INNER JOIN sales_order_item ON sales_order_item.order_id = sales_order_grid.entity_id;
逻辑拆解
LOCATE(@initials, product_options):定位@initials在product_options字段中首次出现的位置+ LENGTH(@initials):跳过@initials本身的长度,精准定位到目标内容的起始点SUBSTRING(..., 定位后的起始位置):截取从@initials之后开始的完整子串SUBSTRING_INDEX(..., @initialsE, 1):在上述子串中,截取到第一个@initialsE之前的片段,也就是我们需要的目标内容
异常场景处理(可选)
如果存在product_options字段不包含@initials的情况,上述语句会返回整个字段内容,可添加判断逻辑过滤这类场景:
SET @initials := 'appear)","value":"'; SET @initialsE := '"'; SELECT sales_order_item.product_options, CASE WHEN LOCATE(@initials, sales_order_item.product_options) > 0 THEN SUBSTRING_INDEX( SUBSTRING(sales_order_item.product_options, LOCATE(@initials, sales_order_item.product_options) + LENGTH(@initials)), @initialsE, 1 ) ELSE NULL -- 也可替换为你需要的默认值 END AS `Name` FROM sales_order_grid INNER JOIN sales_order_item ON sales_order_item.order_id = sales_order_grid.entity_id;
内容的提问来源于stack exchange,提问作者miller75
相关产品推荐
相关产品推荐

