【问题标题】:String manipulation in a SQL result setSQL 结果集中的字符串操作
【发布时间】:2013-10-02 02:44:51
【问题描述】:

我目前正在研究 sql 语句,并对网上的这个具体练习感到好奇。 问题是 “如何加密一行中包含两个或更多空格的每个字母?(不包括空格” 我在这里创建了一个示例表

         sample
-----------------------
first
first second
first second third
first second third fourth

这是我想要的:

         sample
-----------------------
first
first second
first ****** *****
first ****** ***** fourth

这是我迄今为止尝试过的:

select name, substring(name, E'(\\s\\w+\\s.*)') from sample ;

【问题讨论】:

  • 如果你有兴趣,我可以给你一个简单的 t-sql 解决方案
  • 我以前没有读过关于 t-sql 的文章,但如果你能给我一些关于我的问题的想法,我将不胜感激。

标签: sql string postgresql substring


【解决方案1】:

简单的选择太复杂了,所以我使用了带有丰富的PostgreSQL字符串函数的函数:

CREATE OR REPLACE FUNCTION hide_middle(s varchar)
    RETURNS varchar AS
$BODY$
DECLARE
    r varchar;
    arr  varchar[];
BEGIN
    r := s;
    arr := regexp_matches(s, '^(\\S+ )(.*)( \\S+)$');
    IF array_length(arr, 1) = 3 THEN
        r := arr[1] || regexp_replace(arr[2], '\\S', '*', 'g') || arr[3];
    END IF;
    RETURN r;
END;
$BODY$
    LANGUAGE 'plpgsql' VOLATILE;

你可以使用它:

select hide_middle('first second third fourth')

【讨论】:

  • 我还在学习 postgresql,所以我希望它只在一个 select 语句中,还没有阅读函数部分。不过谢谢你的回答,我去Postgresql函数的时候会看的。
  • 函数非常有用,而且 PostgreSQL 以多种语言闻名。在那里你会看到 PL/PGSQL,但你可以使用 Perl、Python(我最喜欢的)、Java 等。在我的解决方案中,我使用 \\S+,这意味着:“不是白色字符一次或多次”,但如果你的数据是带有制表符或新行你可以把它改成[^ ]+,意思是“所有字符没有空格,一次或多次”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多