如何使用SQL切换字符串中每个字母的大小写?

时间:2019-10-19 23:43:04

标签: sql postgresql

我需要使用PostgreSQL将其转换为此

dxItw9a4 --> DXiTW9A4

是否已设置任何功能或方式?

4 个答案:

答案 0 :(得分:1)

如果仅处理字符A-Z,则可以在postgres中使用translate函数来转换大小写。

select TRANSLATE(
    'dxItw9a4', -- original text
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', -characters to change
    'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' -- replacement characters.
)

使用上/下功能可以稍微简化它。

select TRANSLATE(
    'dxItw9a4',  -- original text
    upper('dxItw9a4')||lower('dxItw9a4'), --characters to search for
    lower('dxItw9a4')||upper('dxItw9a4') -- replacement characters
);

答案 1 :(得分:1)

这里是一种解决方案,其工作原理是使用regexp_split_to_table()将字符串拆分为字符结果集,然后将其转换为相反的情况,然后使用聚合函数string_agg()再次加入它们:

select 
    string_agg(case when c ~ '[a-z]' then upper(c) else lower(c) end, '') res
from (
    select * from regexp_split_to_table('dxItw9a4', '') as chars(c)
) x

Demo on DB Fiddle

| res      |
| :------- |
| DXiTW9A4 |

答案 2 :(得分:0)

您可以使用PostreSQL支持的以下方法:

UPPER(string_expression)

示例:

SELECT
   CONCAT (
      UPPER (first_name),
      UPPER (last_name)
   ) as full_name
FROM
   staff;

参考:http://www.postgresqltutorial.com/postgresql-letter-case-functions/

答案 3 :(得分:0)

听起来好像OP正在寻找在许多客户端语言中找到的swapcase()函数的SQL版本。一些想法:

  1. 在客户端使用swapcase()。我会的。
  2. 想出一个聪明的正则表达式?我不是那么聪明。
  3. 用手滚动一些东西。

我想尝试一下#3,然后编写一些代码。关于这个功能,我能说的最友好的一点是它可以工作……但我怀疑它的功能是否很好。我正在尝试增强我的PL / pgSQL技能,因此欢迎对改进代码的任何评论。用大多数其他语言编写很多东西要容易得多...但是在很多情况下,将逻辑推送到服务器上是有益的,我认为值得付出一些努力来熟悉PL / pgSQL。但是,同样,我希望在客户端使用swapcase()或等效的手动版本。

CREATE OR REPLACE FUNCTION swapcase(in_text text) RETURNS text as
$BODY$
DECLARE
    out_text text;
    test_char text;
    ascii_code smallint;
    characters_arr_text  text[];
begin

   out_text  :='';
   test_char := '';
   select into characters_arr_text regexp_split_to_array(in_text,'');

    FOREACH test_char IN array characters_arr_text LOOP

        ascii_code := ascii(test_char);

        IF (ascii_code BETWEEN 65 and 90) THEN 
            out_text := out_text || LOWER(test_char);

        ELSIF (ascii_code BETWEEN 97 and 122) THEN 
            out_text := out_text || UPPER(test_char);

         ELSE
          out_text := out_text || test_char;
        END IF;

    END LOOP;

    RETURN out_text;

END
$BODY$
LANGUAGE 'plpgsql';

这是一个电话:

select swapcase('dxItw9a4'); --  DXiTW9A4

还有一个更长的电话显示它有效:

select 'dxItw9a4' as input,
        swapcase('dxItw9a4') as output,
        'DXiTW9A4' as expected_output,
        swapcase('dxItw9a4') = 'DXiTW9A4' as pass;

更好

这是一个使用GMB代码的swapcase()函数。

CREATE OR REPLACE FUNCTION swapcase(in_text text) RETURNS text as
$BODY$

    select string_agg(
                case when character ~ '[a-z]' then 
                    upper(character) 
                else 
                    lower(character)
                 end, '') as result_text

    from (select * 
            from regexp_split_to_table(in_text, '') as character) as subquery

$BODY$
LANGUAGE 'sql';