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

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

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

我该怎么做呢?

【问题讨论】:

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

标签: sql replace amazon-redshift


【解决方案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
    

    【讨论】:

    • 糟糕。没看到那个标签!
    猜你喜欢
    • 2018-05-22
    • 2011-04-10
    • 2021-07-21
    • 1970-01-01
    • 2019-12-15
    • 2016-10-28
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多