You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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;

逻辑拆解

  1. LOCATE(@initials, product_options):定位@initials在product_options字段中首次出现的位置
  2. + LENGTH(@initials):跳过@initials本身的长度,精准定位到目标内容的起始点
  3. SUBSTRING(..., 定位后的起始位置):截取从@initials之后开始的完整子串
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:38:29