【问题标题】:Remove certain characters in a column Snowflake删除列雪花中的某些字符
【发布时间】:2022-01-20 22:59:52
【问题描述】:

我在“EARTH PLANET-ABC”、“MARS PLANET - ABC”、“JUPITER -ABC”、“VENUS-ABC”等列中有数据。我需要返回值“EARTH PLANET”、“ MARS'、'JUPITER'、VENUS 等,只要列的末尾有 ABC。我试过REPLACE(COLUMN_NAME,'ABC','')。它从列中的条目中删除了 ABC,但仍返回“-”以及条目中 ABC 之前/前面的空格。我想看地球行星'、'火星'、'木星'、金星,但我得到的是'地球行星-'、'火星行星-'、'木星-'、'金星-'等。在这种情况下,REGEXP 会有所帮助吗?

【问题讨论】:

  • ABC前是否总是有破折号和空格?
  • 如果你说 REPLACE(COLUMN_NAME,'ABC','') 它只会替换 ABC。如果您说 REPLACE(COLUMN_NAME,' - ABC','') 它只会替换空格破折号空格 ABC 是空格破折号空格是标准空格还是会更改(正如您在此处输入的那样)
  • 空格和破折号改变它不是标准的,但它总是在末尾​​span>

标签: sql replace snowflake-cloud-data-platform


【解决方案1】:

一些实验给了我们这些部分答案,ENDSWITH 看起来很有希望,但我最终使用了更长的过程:

SELECT
    column1,
    ENDSWITH(trim(column1), 'ABC') as end_with_abc,
    SPLIT(column1, '-') as s,
    array_size(s) AS len_s,
    trim(get(s, len_s -1)) as last,
    charindex('-', REVERSE(column1), 3) as last_token,
    length(column1) - last_token as pos,
    substr(column1,1,pos) as prefix,
    iff(len_s > 1 AND last = 'ABC', prefix, column1) as answer
FROM values 
    ('EARTH PLANET-ABC'), 
    ('MARS PLANET - ABC'), 
    ('JUPITER -ABC'), 
    ('VENUS- ABC'),
    ('VENUS_BUT_NOT_DEF'),
    ('VENUS - DEF');

给予:

COLUMN1 END_WITH_ABC S LEN_S LAST LAST_TOKEN POS PREFIX ANSWER
EARTH PLANET-ABC TRUE [ "EARTH PLANET", "ABC" ] 2 ABC 4 12 EARTH PLANET EARTH PLANET
MARS PLANET - ABC TRUE [ "MARS PLANET ", " ABC" ] 2 ABC 5 12 MARS PLANET MARS PLANET
JUPITER -ABC TRUE [ "JUPITER ", "ABC" ] 2 ABC 4 8 JUPITER JUPITER
VENUS- ABC TRUE [ "VENUS", " ABC" ] 2 ABC 5 5 VENUS VENUS
VENUS_BUT_NOT_DEF FALSE [ "VENUS_BUT_NOT_DEF" ] 1 VENUS_BUT_NOT_DEF 0 17 VENUS_BUT_NOT_DEF VENUS_BUT_NOT_DEF
VENUS - DEF FALSE [ "VENUS ", " DEF" ] 2 DEF 5 6 VENUS VENUS - DEF

可以压缩成:

SELECT
    column1,
    SPLIT(column1, '-') as s,
    iff(array_size(s) > 1 AND trim(get(s, array_size(s) -1)) = 'ABC', substr(column1, 1, length(column1) - charindex('-', REVERSE(column1), 3)), column1) as answer
FROM values 
    ('EARTH PLANET-ABC'), 
    ('MARS PLANET - ABC'), 
    ('JUPITER -ABC'), 
    ('VENUS- ABC'),
    ('VENUS_BUT_NOT_DEF'),
    ('VENUS - DEF');

或者如果你喜欢超压缩:

SELECT
    column1,
    iff(array_size(SPLIT(column1, '-')) > 1 AND trim(get(SPLIT(column1, '-'), array_size(SPLIT(column1, '-')) -1)) = 'ABC', substr(column1, 1, length(column1) - charindex('-', REVERSE(column1), 3)), column1) as answer
FROM values 
    ('EARTH PLANET-ABC'), 
    ('MARS PLANET - ABC'), 
    ('JUPITER -ABC'), 
    ('VENUS- ABC'),
    ('VENUS_BUT_NOT_DEF'),
    ('VENUS - DEF');
COLUMN1 ANSWER
EARTH PLANET-ABC EARTH PLANET
MARS PLANET - ABC MARS PLANET
JUPITER -ABC JUPITER
VENUS- ABC VENUS
VENUS_BUT_NOT_DEF VENUS_BUT_NOT_DEF
VENUS - DEF VENUS - DEF

您可以使用 REGEXP_SUBSTR 解决:

SELECT
    column1 as orig,
    COALESCE(regexp_substr(column1, '^(.*)-\\s*ABC\\s*$', 1,1,'e'), column1) as answer
FROM values 
    ('EARTH PLANET-ABC'), 
    ('MARS PLANET - ABC'), 
    ('JUPITER -ABC'), 
    ('VENUS- ABC'),
    ('VENUS_BUT_NOT_DEF'),
    ('VENUS - DEF');

给予:

ORIG ANSWER
EARTH PLANET-ABC EARTH PLANET
MARS PLANET - ABC MARS PLANET
JUPITER -ABC JUPITER
VENUS- ABC VENUS
VENUS_BUT_NOT_DEF VENUS_BUT_NOT_DEF
VENUS - DEF VENUS - DEF

【讨论】:

  • regexp_substr 有效!谢谢!我仍然看到一些条目,例如 'Earth 1 - text.serve ABC' 和 'Earth 1 to 04_30_07-ABC' 。你能帮忙吗?
【解决方案2】:
SELECT SPLIT_PART(column,'-',1)::varchar

这会用连字符分割你的字段,然后给你它的第一部分。好像这就是你要找的东西。您可能还需要修剪结果以处理剩余的任何空格。

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多