43

我需要在最后一个“=”(http://www.domain.com?query=blablabla -> blablabla)之后提取所有内容,但此查询返回整个字符串。我在这里哪里出错了:

SELECT RIGHT(supplier_reference, CHAR_LENGTH(supplier_reference) - SUBSTRING('=', supplier_reference)) 
FROM ps_product
4

6 回答 6

82
select SUBSTRING_INDEX(supplier_reference,'=',-1) from ps_product;

请使用作为进一步参考。

于 2013-10-21T13:19:30.213 回答
9

试试这个(如果字符串中有多个 '=' 字符,它应该可以工作):

SELECT RIGHT(supplier_reference, (CHARINDEX('=',REVERSE(supplier_reference),0))-1) FROM ps_product
于 2013-10-21T13:19:45.777 回答
7

在 MySQL 中试试这个。

right(field,((CHAR_LENGTH(field))-(InStr(field,','))))
于 2015-06-04T22:30:27.773 回答
6

在 MySQL 中,如果字符串中有多个 '=' 字符,则此方法有效

SUBSTRING(supplier_reference FROM (LOCATE('=',supplier_reference)+1))

它在找到第一个 = 之后返回子字符串 (+1)

于 2017-09-18T15:39:25.607 回答
1

我一直在做类似的事情,经过几次尝试和失败后,我想到了这个:

示例: STRING-TO-TEST-ON = 'ab,cd,ef,gh'

我想从字符串中最后一次出现“,”(逗号)之后提取所有内容......导致“gh”。

我的查询是:

SELECT SUBSTR('ab,cd,ef,gh' FROM (LENGTH('ab,cd,ef,gh') - (LOCATE(",",REVERSE('ab,cd,ef,gh'))-1)+1)) AS `wantedString`

现在让我试着解释一下我做了什么......

  1. 我必须从字符串中找到最后一个“,”的位置并计算想要的字符串长度,使用LOCATE(",",REVERSE('ab,cd,ef,gh'))-1通过反转初始字符串我实际上必须找到字符串中“,”的第一次出现......这是' t 很难做到......然后 -1 实际找到没有“,”的字符串长度。

  2. 通过从初始字符串长度中减去我在第一步计算的字符串长度来计算我想要的字符串的位置:

    长度('ab,cd,ef,gh') - (LOCATE(",",REVERSE('ab,cd,ef,gh'))-1)+1

我有 (+1) 因为我实际上需要最后一个 "," .. 之后的字符串位置并且不包含 ","。希望这是有道理的。

  1. 剩下要做的就是从计算的位置对我的初始字符串运行 SUBSTR。

我没有在大字符串上测试过查询,所以我不知道它有多慢。因此,如果有人真的在大字符串上测试它,我会很高兴知道结果。

于 2018-10-17T20:23:57.033 回答
0

对于 SQL Management Studio,我使用了 BWS 答案的变体。这会将数据获取到“=”的右侧,如果符号不存在,则为 NULL:

   CASE WHEN (RIGHT(supplier_reference, CASE WHEN (CHARINDEX('=',supplier_reference,0)) = 0 THEN
    0 ELSE CHARINDEX('=', supplier_reference) -1 END)) <> '' THEN (RIGHT(supplier_reference, CASE WHEN (CHARINDEX('=',supplier_reference,0)) = 0 THEN
    0 ELSE CHARINDEX('=', supplier_reference) -1 END)) ELSE NULL END
于 2016-11-21T15:40:37.743 回答