代码之家  ›  专栏  ›  技术社区  ›  Andrus

如何为带有结束空格的char(n)类型创建startswith函数

  •  0
  • Andrus  · 技术社区  · 6 年前

    我需要创建startswith函数,该函数返回true if char(n)数据库 列以一些字符开头,这些字符 结尾可以包含空格。 空格应该像其他字符一样处理。

    数据库有两个值a和aa。我希望startwith('a')(不带尾随空格)同时与aa和a匹配,但startwith('a')(带尾随空格)只与a匹配。

    使用下面的示例数据

    startswith( test, 'A')   -- works
    startswith( test, 'A  ')  -- returns wrong result : false
    StartsWith(test, rpad('A',20) )  -- returns wrong result : false
    

    应该返回true

    但是

    startswith( test, RPAD( 'A', 21))

    应返回false,因为检查字符串结尾有多余的空间。

    数据库包含具有char(20)类型列的测试列,而这不能 改变。

    我试过下面的代码,但它返回false。

    如何解决这个问题使它返回真值? 从9.1开始使用Postgres

    安德鲁斯。

    CREATE or replace FUNCTION public.likeescape( str text )
    --  
    https://stackoverflow.com/questions/10153440/how-to-escape-string-while-matching-pattern-in-postgresql
    RETURNS text AS $$
    SELECT replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') ;
    $$ LANGUAGE sql IMMUTABLE;
    
    CREATE or replace FUNCTION public.StartWith( cstr text, algusosa text )
    RETURNS bool AS $$
    SELECT $2 is null or $1 like likeescape($2) ||'%' ESCAPE '^' ;
    $$ LANGUAGE sql IMMUTABLE;
    
    create temp table test ( test char(20) ) on commit drop;
    insert into test values ('A' );
    insert into test values ('AA' );
    
    select StartWith(test, 'A ' ) from test
    

    我还将此发布到pgsql通用邮件列表。

    1 回复  |  直到 6 年前
        1
  •  1
  •   a_horse_with_no_name    6 年前

    8.3. Character Types 以下内容:

    类型值 character 在物理上用指定宽度的空格填充 n个 ,并以这种方式存储和显示。然而,填充空间在语义上被视为无关紧要。比较两个类型的值时忽略尾随空格 性格 ,它们将在转换 性格 值设置为其他字符串类型之一。注意尾随空格在 character varying text 值,以及使用模式匹配时,例如 LIKE ,正则表达式。

    注意,函数的参数都是 文本 .当你把它递过柱子时 test 以及文字 'A ' , 测试 在隐式强制转换中丢失后面的空格,而在文本强制转换中则没有。

    'A' LIKE 'A %' ESCAPE '^'
    

    这不是真的。

    可以重载函数并创建其副本,其中第一个参数是 char 或者只使用正则表达式而不是定义自己的函数,比如 test ~ '^A ' rtrim() 空间远离 烧焦 把它当作“无空间”一样对待 rtrim(test) LIKE 'A%' .我更喜欢后者。