SQL SELECT 某个字符后的所有内容

Posted

技术标签:

【中文标题】SQL SELECT 某个字符后的所有内容【英文标题】:SQL SELECT everything after a certain character 【发布时间】:2013-10-29 23:58:06 【问题描述】:

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

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

【问题讨论】:

您使用的是什么数据库引擎?这不是 SQL Server,对吧? 看到这个答案:***.com/a/18422739/2713729 【参考方案1】:
select SUBSTRING_INDEX(supplier_reference,'=',-1) from ps_product;

请使用this 作进一步参考。

【讨论】:

这可能会导致一些问题,如果列中没有'=',在这种情况下你可以使用:SELECT IF(LOCATE('=', supplier_reference), SUBSTRING_INDEX(supplier_reference,'=',-1), default_value) FROM ps_product;,你可以设置一个默认值而不是返回原始的完整列。跨度> 如果字符串包含多个 '=' 并且我想要第一个 '=' 之后的所有内容怎么办? 这并不完全正确。为了能够设置正确的负索引,您需要确切知道搜索字符串在主题中出现的次数。为此,这可能会有所帮助:***.com/a/12344881/2713729【参考方案2】:

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

SELECT RIGHT(supplier_reference, (CHARINDEX('=',REVERSE(supplier_reference),0))-1) FROM ps_product

【讨论】:

CHARINDEX 在问题所在的 mysql 中不存在。 MySQL 的替代方案是 LOCATE。【参考方案3】:

在 MySQL 中试试这个。

right(field,((CHAR_LENGTH(field))-(InStr(field,','))))

【讨论】:

感谢您的贡献。添加一些关于如何解决问题的解释会更有帮助。【参考方案4】:

对于 SQL 管理工作室,我使用了 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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

这在有多个 '=' 并且我们想要在第一次出现 '=' 之后的字符串时很有用【参考方案6】:

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

示例: 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`

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

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

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

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

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

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

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

【讨论】:

以上是关于SQL SELECT 某个字符后的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server替换,删除特定字符后的所有内容

用sql语句查出来字段里包含某个字符串的所有记录

SQL Server:在某个字符之前提取所有内容

现在用sql语句查出来字段里包含某个字符串的所有记录怎么查

mysql 截取指定位置后面的所有的字符

删除mysql中字符串后的所有内容