首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花sql中的PATINDEX

火花sql中的PATINDEX
EN

Stack Overflow用户
提问于 2019-10-10 18:40:57
回答 3查看 2.7K关注 0票数 0

我在sql中有这样的语句

代码语言:javascript
复制
Case WHEN AAAA is not null then AAAA
     Else RTRIM(LEFT(BBBB, PATINDEX('%[0-9]%', BBBB) - 1))
     END as NAME. 

我需要将其转换为激发sql。我试过使用indexOf,但它不接受字符串'%0-9%。如何将上述语句转换为激发SQL。请帮帮忙

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-12 15:25:00

我的代码用scala火花实现了这一点。我用udf做的。编辑:假设字符串需要从第一次出现的数字中删除。

代码语言:javascript
复制
import spark.implicits._
val df = Seq(("SOUTH TEXAS SYNDICATE 454C"),
  ("SANDERS 34-27 #3TF"),
  ("K. R. BRACKEN B 3H"))
  .toDF("name")

df.createOrReplaceTempView("temp")
val getIndexOfFirstNumber = (s: String) => {
      val str = s.split("\\D+").filter(_.nonEmpty).toList
      s.indexOf(str(0))
    }
spark.udf.register("getIndexOfFirstNumber", getIndexOfFirstNumber)

spark.sql("""
select name,substr(name, 0, getIndexOfFirstNumber(name) -1) as final_name
from temp
""").show(20,false)

结果:

代码语言:javascript
复制
   +------------------------------------+----------------------+
   |name                                |final_name            |
   +------------------------------------+----------------------+
   |SOUTH TEXAS SYNDICATE 454C          |SOUTH TEXAS SYNDICATE |
   |SANDERS 34-27 #3TF                  |SANDERS               |
   |K. R. BRACKEN B 3H                  |K. R. BRACKEN B       |
   |ALEXANDER-WESSENDORFF 1 (SA) A5 A 5H|ALEXANDER-WESSENDORFF |
   |USZYNSKI-FURLOW (SA) B 3H           |USZYNSKI-FURLOW (SA) B|
   +------------------------------------+----------------------+
票数 2
EN

Stack Overflow用户

发布于 2020-09-30 14:04:22

基于Manish的答案,我构建了这个,它更通用,是用Python构建的。您也可以在spark上使用它,示例不是用于数字,而是用于字符串日期。

代码语言:javascript
复制
import re
def PATINDEX(string,s):
    if s:
        match = re.search(string, s)
        if match:
            return match.start()+1
        else:
            return 0
    else:
        return 0
spark.udf.register("PATINDEX", PATINDEX)
PATINDEX('DATE','a2aDATEs2s')
票数 1
EN

Stack Overflow用户

发布于 2022-04-19 10:22:35

可以使用以下方法使用Databricks或Spark删除前导零。

代码语言:javascript
复制
REPLACE(LTRIM(REPLACE('0000123045','0',' ')),' ','0')

解释:

  • 第一个替换函数用空空间替换零。45'

示例:‘123

  • LTRIM函数从左侧移除空空间。45'

示例:'123

然后,

  • 第三个替换函数将空空间替换为零。Example:'123045'

类似地,您可以使用RTRIM函数相应地删除尾随零。

如果你喜欢我的答案,请投票。谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58329209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档