Upper(поле_с_Български_символи) в Interbase
6 отговора
204 прегледа
Upper(поле_с_Български_символи) в Interbase
Имам следния проблем: когато използвам ф-цията Upper() тя ми връща главните букви, които са били въведени на латиница, но българските не променя. Пример:
Upper('asd')='ASD' - добре, но
Upper('яжij')='яжIJ', а трябва да е 'ЯЖIJ'. Доколкото знам това може да се оправи с локализиране, но незнам как. Ползвам Interbase за база.
И още едно въпросче....
Доколкото знам interbase поддържа if-then-else или case statement, но не съм наясно със синтаксиса. Искам да направя следните неща:
1. Да селектна от таблица дадено поле, като ако полето е празен стринг да селектна някаква подразбираща се стойност;
2. Да селектна от join-ата таблица дадено поле, като ако там няма съответен запис, да селектна(избера) подразбираща се стойност.
3. В зависимост от стойността на дадено поле да селектна някаква стойност, например имам поле YesNo и искам ако стойността му е 1, да селектна 'Да', в противан случай да селектна "Не".....
Ако не съм обяснил достатъчно ясно питайте...мерси :)
Upper('asd')='ASD' - добре, но
Upper('яжij')='яжIJ', а трябва да е 'ЯЖIJ'. Доколкото знам това може да се оправи с локализиране, но незнам как. Ползвам Interbase за база.
И още едно въпросче....
Доколкото знам interbase поддържа if-then-else или case statement, но не съм наясно със синтаксиса. Искам да направя следните неща:
1. Да селектна от таблица дадено поле, като ако полето е празен стринг да селектна някаква подразбираща се стойност;
2. Да селектна от join-ата таблица дадено поле, като ако там няма съответен запис, да селектна(избера) подразбираща се стойност.
3. В зависимост от стойността на дадено поле да селектна някаква стойност, например имам поле YesNo и искам ако стойността му е 1, да селектна 'Да', в противан случай да селектна "Не".....
Ако не съм обяснил достатъчно ясно питайте...мерси :)
Collations
Здравей!
За да работят тези функции с кирилица трябва charset-а на базата да ти е WIN1251 и подразбиращият се колейшън да ти е PXW_CYRL. Преди Firebird 1.5 колейшъна по подразбиране (WIN1251) не работи и затова става така при теб.
Лошото е, че не се получава да смени колейшъна на текстовите колони в базата. Или ще трябва да си направиш нова с чарсет win1251, да смениш подразбиращия се колейшън (UPDATE RDB$CHARACTER_SETS SET RDB$DEFAULT_COLLATE_NAME='PXW_CYRL' WHERE RDB$CHARACTER_SET_NAME = 'WIN1251') и тогава да си създадеш и попълниш таблиците или пък да си добавиш нови колони с този чарсет и колейшън.
IF...THEN...ELSE можеш да ползваш в тригери и процедури. За селекти има CASE, обаче той не се поддържа от IB 6. Специално за 3-та точка можеш да използваш OnGetText на фийлда за да си променяш данните:
if Sender.AsInteger = 0 then Text := 'Не' else Text := 'Да';
Ако това ти върши работа - добре. Ама иначе според мен ще е по-добре цялата тая работа да я направиш на сторед процедура.
Айде успех и ако нещо не ти е ясно - питай
За да работят тези функции с кирилица трябва charset-а на базата да ти е WIN1251 и подразбиращият се колейшън да ти е PXW_CYRL. Преди Firebird 1.5 колейшъна по подразбиране (WIN1251) не работи и затова става така при теб.
Лошото е, че не се получава да смени колейшъна на текстовите колони в базата. Или ще трябва да си направиш нова с чарсет win1251, да смениш подразбиращия се колейшън (UPDATE RDB$CHARACTER_SETS SET RDB$DEFAULT_COLLATE_NAME='PXW_CYRL' WHERE RDB$CHARACTER_SET_NAME = 'WIN1251') и тогава да си създадеш и попълниш таблиците или пък да си добавиш нови колони с този чарсет и колейшън.
IF...THEN...ELSE можеш да ползваш в тригери и процедури. За селекти има CASE, обаче той не се поддържа от IB 6. Специално за 3-та точка можеш да използваш OnGetText на фийлда за да си променяш данните:
if Sender.AsInteger = 0 then Text := 'Не' else Text := 'Да';
Ако това ти върши работа - добре. Ама иначе според мен ще е по-добре цялата тая работа да я направиш на сторед процедура.
Айде успех и ако нещо не ти е ясно - питай
Re: Collations
Мерси много :) Имам въпрос въпросче за if-then-else...май нещо не се ориентирам добре с IB-то: робвах с това
create procedure tmp
returns (charCase varchar(10))
as
begin
for
select
if upper(name2)=name2 then 'UPPER'
else 'LOWER'
from charCase
into new_name
do suspend;
end
ама нещо не се компилира...може ли малко по-подробно?
Мерси за пореден път :)
create procedure tmp
returns (charCase varchar(10))
as
begin
for
select
if upper(name2)=name2 then 'UPPER'
else 'LOWER'
from charCase
into new_name
do suspend;
end
ама нещо не се компилира...може ли малко по-подробно?
Мерси за пореден път :)
Тц :)
Като казах, че можеш да изпозлваш IF в сторед процедура имах предвид, че в езика го има. Ти пак го правиш в select-а, макар и той да ти е в процедурата. Няма да стане така :)
create procedure tmp
returns (charCase varchar(10))
as
declare variable name2 varchar(10);
begin
for
select name2
from TableName
into :name2
do
begin
if (upper(name2) = name2) then
charCase = 'UPPER';
else
charCase = 'LOWER';
suspend;
end
end
Re: Тц :)
Да допълня за пълнота за FB1.5 може да стане и
select
case upper(name2)
when name2 then 'UPPER'
else 'LOWER'
end
from charCase
Още един въпрос за stored procedure-tata
Циклите в stored procedure се оправляват от броя записи (for select .... from.. do ...) Мога ли да кажа този цикъл да се изпълни само веднъж? Смисал SELECT TOP 1 или нещо от сорта...? Аналогично само 2 пъти...
Re: Още един въпрос за stored procedure-tata
for select first 1 id from clients into :id do
Пълният синтаксис е select first n skip m ... Малко е безмислен без order by.
Поддържа се от Firebird, но не и от Interbase. Ако си с IB можеш да направиш
for select ....
do
begin
...
suspend;
exit;
end
Пълният синтаксис е select first n skip m ... Малко е безмислен без order by.
Поддържа се от Firebird, но не и от Interbase. Ако си с IB можеш да направиш
for select ....
do
begin
...
suspend;
exit;
end