postgresql 将CamelCase转换为snake_case

bprjcwpo  于 2023-04-11  发布在  PostgreSQL
关注(0)|答案(4)|浏览(130)

需要以下查询的结果

select regexp_replace('StackOverflow', 'something', 'something')

作为

stack_overflow
ngynwnxp

ngynwnxp1#

下面的正则表达式在每个大写字母前添加一个下划线:

regexp_replace(name, '([A-Z])','_\1', 'g'))

由于这会导致在开始处没有下划线,因此需要使用trim()将其删除

trim(both '_' from lower(regexp_replace(name, '([A-Z])','_\1', 'g')))

以下查询:

with names (name) as (
  values ('StackOverflow'), 
         ('Foo'), 
         ('FooBar'), 
         ('foobar'), 
         ('StackOverflowCom')
)
select name, trim(both '_' from lower(regexp_replace(name, '([A-Z])','_\1', 'g'))) as new_name
from names;

返回:

name             | new_name          
-----------------+-------------------
StackOverflow    | stack_overflow    
Foo              | foo               
FooBar           | foo_bar           
foobar           | foobar            
StackOverflowCom | stack_overflow_com
9rnv2umw

9rnv2umw2#

我想你想要的是

lower(
  regexp_replace(
    replace(column_name, ' ', '_'),
    '([[:lower:]])([[:upper:]])',
    '\1_\2',
    'g'
  )
)

我们在这里测试它,

WITH t (name) as (
  VALUES ('StackOverflow'), 
    ('Foo'), 
    ('FooBar'), 
    ('foobar'), 
    ('StackOverflowCom'),
    ('BLEHHHHokBaz')  -- doesn't go funky
)
SELECT name, lower(
  regexp_replace(
    replace(name, ' ', '_'),
    '([[:lower:]])([[:upper:]])',
    '\1_\2',
    'g'
  )
) AS new_name
FROM t;

这比@a_horse_with_no_name有一个优点,它可以处理连续的大写字母,也可以解决空格问题。
还可以看到,

0yg35tkg

0yg35tkg3#

SnakeCase到CamelCase

SELECT REPLACE(INITCAP('hamza_rajput'), '_',' ') as camel_case;

CamelCase到SnakeCase

SELECT LOWER(regexp_replace('hamzaRajput', '([A-Z])','_\1', 'g')) as snake_case;
vdzxcuhz

vdzxcuhz4#

多亏了chatGPT,我在Snowflake SQL中得到了这个:

LOWER(REGEXP_REPLACE(your_string, '([a-z])([A-Z])', '\\1_\\2', 1, 0))

相关问题