刮掉字符前后的 SQL 数据

Posted

技术标签:

【中文标题】刮掉字符前后的 SQL 数据【英文标题】:Shaving off SQL data before and after character 【发布时间】:2017-10-02 20:15:51 【问题描述】:

我试图在 _ 字符之前和之后提取 SQL 数据,但是每个字符串中有多个 _。

例如,在字符串02_HVDO_HistoryOfScience_100__517 中,我只希望结果为HistoryOfScience 或任何最长的单词字符串。

我该怎么做呢?

【问题讨论】:

编辑您的问题并标记您正在使用的数据库。并解释你是如何到达“HistoryOfScience”的,而不是说“HVDO”或“100”。 您可以在 Redshift 中使用 python UDF 来执行此操作。需要帮助吗? Sam,请看看下面我的解决方案,如果它适合你,请“接受”。 【参考方案1】:

这应该可行

create or replace function f_longest_substring (s varchar(max))
  returns varchar(max)
stable
as $$
def f_longest_substring(input_string):
    parts = input_string.split("_")
    largest_string=""
    for part in parts:
        if len(part)>len(largest_string):
            largest_string=part
    return largest_string
return f_longest_substring(s)

$$ language plpythonu;

select f_longest_substring ('02_HVDO_HistoryOfScience_100__517');

【讨论】:

【参考方案2】:

假设 MS-SQL Server,您可以从here 创建拆分函数

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

并用于获得结果:

SELECT TOP 1 * FROM dbo.fnSplitString('02_HVDO_HistoryOfScience_100__517','_')
ORDER BY LEN(splitdata) DESC

【讨论】:

糟糕。没看到那个标签!

以上是关于刮掉字符前后的 SQL 数据的主要内容,如果未能解决你的问题,请参考以下文章

linux如何截取指定字符串行前后N行的数据

高手,在sql语句里如何提取出分隔符前后的字符???不要太长的。

SQL Server 提供了一些字符串函数,以下说法中正确的是

从sql表里截取字符串中的日期

前后端数据交互中的特殊字符

sql 删去记录中指定字符开头的字符串