Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему a ILIKE b проходит, а lower(a) = lower(b) - нет? / 9 сообщений из 9, страница 1 из 1
04.06.2008, 17:33
    #35354770
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему a ILIKE b проходит, а lower(a) = lower(b) - нет?
Таблица:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE temp_samples
(
  "SampleCS" character( 40 ) NOT NULL,
  "SampleID" serial NOT NULL
);

CREATE UNIQUE INDEX "IDX_temp_samples"
  ON temp_samples
  USING btree
  (lower("SampleCS"));


Функция с ILIKE:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE FUNCTION temp_samples_upsert(SampleCS "temp_samples"."SampleCS"%Type
)
RETURNS integer AS '

DECLARE
    SampleID integer := 0;
    
BEGIN
    INSERT INTO "temp_samples" ("SampleCS") VALUES(SampleCS);
    SampleID := (SELECT "SampleID" FROM "temp_samples" WHERE "SampleCS" ILIKE SampleCS);
    RETURN SampleID;
    
    EXCEPTION WHEN UNIQUE_VIOLATION THEN
        SampleID := (SELECT "SampleID" FROM "temp_samples" WHERE "SampleCS" ILIKE SampleCS);
            
    RETURN SampleID;
END;

' LANGUAGE 'PLPGSQL' SECURITY DEFINER;
Работает!!! (возвращает значение).

Если переписать, используя lower = lower:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION temp_samples_upsert(SampleCS "temp_samples"."SampleCS"%Type
)
RETURNS integer AS '

DECLARE
    SampleID integer := 0;
    
BEGIN
    INSERT INTO "temp_samples" ("SampleCS") VALUES(SampleCS);
    SampleID := (SELECT "SampleID" FROM "temp_samples" WHERE lower("SampleCS") = lower(''SampleCS''));
    RETURN SampleID;
    
    EXCEPTION WHEN UNIQUE_VIOLATION THEN        
        SampleID := (SELECT "SampleID" FROM "temp_samples" WHERE lower("SampleCS") = lower(''SampleCS''));
    
    RETURN SampleID;
END;


' LANGUAGE 'PLPGSQL' SECURITY DEFINER;

Возвращает пустоту!

ПОЧЕМУ?

Пример вызова:
select * from temp_samples_upsert('0D22C69728BE7FC7EEFFBC3E75EE8A7C0C13EBE4');
...
Рейтинг: 0 / 0
04.06.2008, 17:53
    #35354828
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему a ILIKE b проходит, а lower(a) = lower(b) - нет?
Тип поля SampleCS?
...
Рейтинг: 0 / 0
04.06.2008, 18:02
    #35354851
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему a ILIKE b проходит, а lower(a) = lower(b) - нет?
вон же, в таблице: "SampleCS" character(40)
...
Рейтинг: 0 / 0
04.06.2008, 18:19
    #35354888
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему a ILIKE b проходит, а lower(a) = lower(b) - нет?
Роберт, Вы знаете что дублированная одинарная кавычка внутри строки означает её эскейпинг ?

Ваше выражение

Код: plaintext
SELECT "SampleID" FROM "temp_samples" WHERE lower("SampleCS") = lower(''SampleCS'')

преварщается в

Код: plaintext
SELECT "SampleID" FROM "temp_samples" WHERE lower("SampleCS") = lower('SampleCS')

в теле функции, то есть Вы сравниваете значение поля SampleCS приведённое к нижнему регистру с константной строкой 'SampleCS' так же приведённой к нижнему регистру :)

ps: что бы избежать таких вот описок - используйте моноширинный шрифт в редакторе (тогда сразу видно что там две одинарных кавычки а не одна двойная) и специальный синтаксис определения строк -
Код: plaintext
$$ строка - тело функции $$
для тела функции


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
04.06.2008, 18:21
    #35354891
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему a ILIKE b проходит, а lower(a) = lower(b) - нет?
Robert Ayrapetyanвон же, в таблице: "SampleCS" character(40)Да, не заметил.
У меня обратная картина. Я, правда, не стал функции создавать. Сделал так:
Код: plaintext
1.
2.
3.
CREATE TABLE test_ilike
(
  fld character( 40 )
) 

Код: plaintext
insert into test_ilike (fld) values ('asdf')

находит:
Код: plaintext
select * from test_ilike where lower(fld)=lower('asdf')

находит:
Код: plaintext
select * from test_ilike where fld=lower'asdf'

НЕ находит
Код: plaintext
select * from test_ilike where fld ILIKE 'asdf'

находит
Код: plaintext
select * from test_ilike where fld ILIKE 'asdf%'

Если же поле сделать character varying, то ILIKE тоже работает.

Я считал, почему-то (видимо поэтому: If the string to be stored is shorter than the declared length, values of type character will be space-padded; values of type character varying will simply store the shorter string.), что character добивает значение пробелами до своей длины. Однако
Код: plaintext
select '>'||fld||'<' from test_ilike
Показывает, что их там нет.
...
Рейтинг: 0 / 0
04.06.2008, 18:23
    #35354896
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему a ILIKE b проходит, а lower(a) = lower(b) - нет?
ЁшРоберт, Вы знаете что дублированная одинарная кавычка внутри строки означает её эскейпинг ?Млин, как всё просто. Нужно просто было быть чуть внимательнее :)
...
Рейтинг: 0 / 0
04.06.2008, 18:24
    #35354899
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему a ILIKE b проходит, а lower(a) = lower(b) - нет?
в догонку - называть параметры функции именами совпадающими с названием колонок в таблице с которой работает функция - это сознательно вносить дополнительную путаницу :)

если Вам так хочется это делать - то тогда уж пишите полностью, как-то так:

Код: plaintext
... WHERE lower("temp_samples"."SampleCS") = lower(SampleCS))
а то совсем не понятно какой SampleCS и где имелся ввиду


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
04.06.2008, 18:26
    #35354904
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему a ILIKE b проходит, а lower(a) = lower(b) - нет?
спасибо... дело в том, что я пробовал вариант вообще без кавычек, и он не работал... сейчас, после Вашего ответа, заработал. Мистика.
...
Рейтинг: 0 / 0
04.06.2008, 18:48
    #35354935
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему a ILIKE b проходит, а lower(a) = lower(b) - нет?
а с долларами были проблемы в каком-то из дизайнеров (помойму Sybase), с тех пор перешел на обрамление тела функции в ' '
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему a ILIKE b проходит, а lower(a) = lower(b) - нет? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]