Upper(поле_с_Български_символи) в Interbase

6 отговора 204 прегледа
#1

Upper(поле_с_Български_символи) в Interbase

Имам следния проблем: когато използвам ф-цията Upper() тя ми връща главните букви, които са били въведени на латиница, но българските не променя. Пример:
Upper('asd')='ASD' - добре, но
Upper('яжij')='яжIJ', а трябва да е 'ЯЖIJ'. Доколкото знам това може да се оправи с локализиране, но незнам как. Ползвам Interbase за база.

И още едно въпросче....

Доколкото знам interbase поддържа if-then-else или case statement, но не съм наясно със синтаксиса. Искам да направя следните неща:
1. Да селектна от таблица дадено поле, като ако полето е празен стринг да селектна някаква подразбираща се стойност;
2. Да селектна от join-ата таблица дадено поле, като ако там няма съответен запис, да селектна(избера) подразбираща се стойност.
3. В зависимост от стойността на дадено поле да селектна някаква стойност, например имам поле YesNo и искам ако стойността му е 1, да селектна 'Да', в противан случай да селектна "Не".....

Ако не съм обяснил достатъчно ясно питайте...мерси :)

Отговор
в отговор на VladoVasilev #2

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 := 'Да';
Ако това ти върши работа - добре. Ама иначе според мен ще е по-добре цялата тая работа да я направиш на сторед процедура.

Айде успех и ако нещо не ти е ясно - питай

Отговор
в отговор на andrew_nikoloff #3

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

ама нещо не се компилира...може ли малко по-подробно?
Мерси за пореден път :)

Отговор
в отговор на VladoVasilev #4

Тц :)

Като казах, че можеш да изпозлваш 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


Отговор
в отговор на andrew_nikoloff #5

Re: Тц :)

Да допълня за пълнота за FB1.5 може да стане и

select
case upper(name2)
when name2 then 'UPPER'
else 'LOWER'
end
from charCase


Отговор
в отговор на VladoVasilev #6

Още един въпрос за stored procedure-tata

Циклите в stored procedure се оправляват от броя записи (for select .... from.. do ...) Мога ли да кажа този цикъл да се изпълни само веднъж? Смисал SELECT TOP 1 или нещо от сорта...? Аналогично само 2 пъти...

Отговор
в отговор на VladoVasilev #7

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

Отговор