[SQL] Функция, которая сравнивает две строки?

vladi1

Плиз, напишите код функции в SQL, которая сравнивает 2 строки на входе, TRUE, если они равны, FALSE, если нет...или хотя бы напишите как обьявляется массив символьный в SQL, и как считывать его по символу(что-то вроде getchar там циклик небось какой-нить, наверно)...

Ivan8209

Ты хорошо вопрос продумал?
---
...Я работаю антинаучным аферистом...

vladi1

Наверно, хотя не знаю, мне вроде так передали..должно получится что-то вроде
declare ........
function.......(x[],y[]) IS или по-SQL-ному...не хнаю как...VARCHAR...что ли
begin....
end.......
function("a","ab")---------->FALSE
function("b","b")----------->TRUE

vladi1

Получилось
DECLARE
result varchar2(10);
FUNCTION MyFunc(Strike1 VARCHAR2, Strike2 VARCHAR2)
RETURN varchar2 IS
BEGIN
IF(Strike1 = Strike2) THEN
RETURN '1';
ELSE
RETURN '0';
end if;
END;

begin
rezalt := MyFunc('a', 'ab');
dbms_output.put_line(result);
end;

sgnik

афигеть

vladi1

Че афигеть? Я и назвал его ламерским вопросом...Кто же спорит, что тебе это легко? А мне нужно было быстренько такую херню написать именно на PL/SQL (SQL я видел 1 раз в жизнитолько что мне сказали, что, оказывается... SQL=Structured Query Language...оставь при себе свои амбиции

6yrop

почему манагер занимаются прогрммированием? он должн впаривать чего-нибудь кому-нмбудь

vladi1

Манагер сменил немного работу....а там надо самую малость SQL понимать....что поделаешь

Marinavo_0507

SQL был специально придуман для всяких там бухгалтеров и манагеров.
Составление запросов на SQL лично я не считаю программированием, аргументы я приводил уже как-то.

Dasar

Все-таки я задам вопрос, почему нельзя сделать просто?:


rezalt := 'a' = 'ab';


Зачем обязательно писать такую громоздкую функцию?

vladi1

не знаю, там немного другое мне надо было(ниже) сразу..я не подумал особо, да и не знал как там операторы работают..К тому же нужна ф-ция, возвращающая что-то, а если IF-THEN-ELSE в моем коде заменить на
rezalt := strike1 = strike2, не спорю - коротко...но ':=' - не всем нравится. IF-THEN, DECODE - наверно, лучше
че бы ты сделал, если бы надо было сравнивать не 2 строки, а 1 слово и ячейки столбца? Если это 1 слово есть хотя бы в 1 строке в столбце таблицы (SELECT Columb_Name FROM Table_Name)- TRUE, нет - False

Dasar

например, так:


result = 0 != (select count(*) from Table_Name where Column_Name = 'Искомое слово')

vladi1

а в теле ф-ции это как выглядит(если не сложно)? Нужно еще чтобы, например, если исходное слово "test", а в единственной строке - "testiruem" - выдавала FALSE

Dasar

> теле ф-ции это как выглядит
Что эта функция должна брать на входе?
> Нужно еще чтобы, например, если исходное слово "test", а в единственной строке - "testiruem" - выдавала FALSE
Приведенный запрос именно так себя и ведет.

vladi1

>Нужно еще чтобы, например, если исходное слово "test", а в единственной строке - "testiruem" - выдавала FALSE
Стормозил!
На входе Strike VARCHAR2(10) и сравнение Strike и (SELECT Columb_Name FROM Table_Name )

Dasar



FUNCTION MyFunc(Strike VARCHAR2)
RETURN bool IS
BEGIN
return 0 != (select count(*) from Table_Name where Column_Name = Strike);
END;

vladi1

return 0 != (select count(*) from Table_Name where Column_Name = Strike);
Subquery not allowed in this context

vladi1

return 0 != (select count(*) from Table_Name where Column_Name = Strike);
аналогично
IF(SELECT COUNT(*) FROM Table_Name WHERE Columb_Name = Strike) THEN
RETURN '1';
ELSE
RETURN '0';
END IF;
Ругается именно на SELECT

vladi1

Не работает!

Dasar

Что не работает?
Когда не работает?
Что при это выдается?
Что должно выдаваться?
ps
Телепаты общаются без форума.

vladi1

Не работает ф-ция
Выдает ошибку "Subquery not allowed in yhis context", PL-SQL 00103 "Encounterd operator "SELECT", line...
т.е. IF(SELECT COUNT(*) FROM Table WHERE Columb=Strike) THEN
RETURN '1';
такой селект нельзя творить

Dasar

напиши так:


declare @q int
set @q = (select ..)
if (@q != 0)

vladi1

Все, спасибо! Вот так написал:
FUNCTION MyFunc(Strike VARCHAR2)
RETURN VARCHAR IS
BEGIN
SELECT COUNT(*)
INTO s
FROM Table
WHERE Columb = Strike;
IF(s>1) then RETURN '1';
ELSE RETURN '0';
END IF;
END;

Dasar

Только все-таки больше 0 , а не больше 1.
Оставить комментарий
Имя или ник:
Комментарий: