Мне нужно создать функцию startwith, которая возвращает true, если столбец базы данных char (n) начинается с некоторых символов, которые могут содержать пробел в конце. Пробелы следует рассматривать как другие символы.
База данных имеет два значения «А» и «АА». Я хочу, чтобы 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
должен вернуть истину
но
startswith( test, RPAD( 'A', 21))
должен вернуть false, так как в конце проверочной строки есть лишний пробел.
База данных содержит тестовый столбец, который имеет столбец типа char (20), и это не может быть изменено.
Я пробовал код ниже, но он возвращает false.
Как это исправить, чтобы он вернул истину? Использование Postgres начиная с 9.1
Андрус.
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-general.
test
= 'A',test
начинается с 'A', не начинается с 'A' и не начинается с 'A ...'. Почему это не так? - person 404   schedule 06.07.2018A
должен совпадать. База данных имеет два значения «А» и «АА». Я хочу, чтобы startwith ('A') возвращал как AA, так и A, но startwith ('A') возвращает только A. Я обновил вопрос - person Andrus   schedule 06.07.2018CREATE TEMP TABLE t (txt CHAR(20)); INSERT INTO t VALUES ('A'); SELECT '_' || txt || '_' FROM t;
возвращает_A_
, аSELECT LENGTH(txt) FROM t;
возвращает1
- person 404   schedule 06.07.2018