아직 사용은 안해봤습니다만(사용을 할려면 델파이에서 dll로 제작해야 할듯하네요.)
예전에 찾은 자료가 보이길래 올려봅니다.(어떤 일본사이트에 찾았습니다.)
(핵심코드(?) 인듯)
function Decode(value1, value2, matchResult, unmatchResult :
PChar) : PChar; cdecl; export;
var s : String;
begin
if (strcomp(value1, value2) = 0) then s := matchResult
else s := unmatchResult;
Result := MakeResultString(PChar(s), nil, 0);
end;
MakeResultString 은, FreeUDFLib 소스코드에 있슴
declare external function f_Decode
cstring(80), cstring(80), cstring(80), cstring(80)
returns cstring(80) /*FREE_IT*/
entry_point 'Decode' module_name 'UdfLib.dll';
주:thread 로컬 변수를 사용하지 않는 경우는, FREE_IT 를 살린다.
·서식: f_Decode(value1, value2, matchResult, unmatchResult)
value1 : 비교하는 값 1
value2 : 비교하는 값 2(NULL 때는, ''를 지정한다)
matchResult : 일치했을 때에 돌려주는 값
unmatchResult: 일치하지 않았을 때에 돌려주는 값
리턴치 : matchResult, unmatchResult 어느쪽이든을 80바이트의 문장
자렬형으로 돌려주므로, 목적의 형태에 CAST 한다.
·주의:
·f_Decode 는, NULL 를 돌려줄 수 없습니다. NULL 의 경우는, ''(장
0 의 캐릭터 라인)을 돌려줍니다. 반환치를 캐릭터 라인 이외의 형태에 CAST 하고 있고
경우, 콘버터 에러가 될테니 주의해 주세요.
·파라미터 value 에, 캐릭터 라인형의 열을 지정했을 경우, NULL 와 길이 0의
캐릭터 라인을 구별하지 않습니다(할 수 없습니다).
·사용예 1: NULL 를 다른 값에 옮겨놓는다
SELECT f_Decode(column1, '', column2, column1) AS value,
CAST(f_Decode( intColumn, '', 0, intColumn) AS INT) AS x,
CAST(f_Decode( dateColumn, '',
'01-JAN-1900', dateColumn) AS DATE) AS y,
CAST(f_Decode(floatColumn, '', 0.0, floatColumn) AS FLOAT) AS z
FROM ...
·사용예 2: CASE식으로 사용한다
SELECT CAST(f_Decode(column1, 1, 'RED',
f_Decode(column1, 2, 'GREEN',
f_Decode(column1, 3, 'BLUE', 'OTHER')))
AS CHAR(6) CHARACTER SET ASCII) AS color
FROM , , ,
·사용예 3: 크로스 집계에 이용
SELECT salesYear,
SUM(CAST(f_Decode(category, 1, amount, 0) AS DEC(10,2))) AS category1,
SUM(CAST(f_Decode(category, 2, amount, 0) AS DEC(10,2))) AS category2,
SUM(CAST(f_Decode(category, 3, amount, 0) AS DEC(10,2))) AS category3
FROM Sales
GROUP BY salesYear
조복기 님이 쓰신 글 :
:
: 두번째 질문하신내용이, 실제 값을 변경할려고 하는것이 아니라
: 오라클의 decode나 M$-sql의 case문과 같은 역활을 원하신다면..
: mers에서 검색해온 작은 팁하나 소개해드립니다..
: 어차피 ib에는 decode함수가없지만, 프로시저로 만들어서 사용할수도 있더군요..
: (사실 udf로 만들어놓으면 좋은데, 실력이 없어서..)
: 검색한 내용을 첨부합니다..
:
: Subject: Re: Decode on Interbase
: Author: sskracic@lavsa.com (Sebastian Skracic)
: Date: 15 Aug 2000 09:34:26 GMT
: Newsgroup: mers.interbase.list
:
:
: --------------------------------------------------------------------------------
: In article <8n9la7$m2h$1@linux.mers.com>, Daniel Severo Junior wrote:
: >Hello people, I need use an function like "decode" on ORACLE, this function
: >make an condition for an expression and return the value passed, else return
: >the second parameter.
:
: Basically, you're out of luck. InterBase does not support CASE statement
: (I was hoping it would be very high on priority list once open source
: release got out of the doors).
:
: But you can always resort to IB's stored procedures. For example,
: you can write simple stored procedure that takes 4 input arguments
: (arg1, arg2, ifeq, ifneq) and outputs scalar value (one row, one column)
: 'ifeq' if arg1=arg2; 'ifneq' otherwise:
:
: SET TERM !! ;
: CREATE PROCEDURE decode_proc (arg1 VARCHAR(200), arg2 VARCHAR(200),
: ifeq VARCHAR(200), ifneq VARCHAR(200) )
: RETURNS (decode VARCHAR(200))
: AS
: BEGIN
: IF (:arg1 = :arg2) THEN
: decode = :ifeq ;
: ELSE
: decode = :ifneq ;
: SUSPEND ;
: END !!
: SET TERM ; !!
:
:
: So this Oracle query:
:
: SELECT
: age,
: decode(age, 20, '20 years old.', 'not 20 years old') AS age_text
: FROM
: employees
:
: ... can be reformulated in InterBase as:
:
: SELECT
: age,
: (SELECT decode FROM decode_proc(age, 20, '20 years old.', 'not 20 years old'))
: age_text
: FROM
: employees
:
:
: Seb.
:
:
: 홍작새 님이 쓰신 글 :
: : select name, job from PERSONAL;
: :
: : 이라는 쿼리를
: :
: : select name as 이름, job as 직업 from PERSONAL;
: :
: : 로 바꾸면 필드명이 이상한 문자로 깨져나오는데요... 어떻게 하면 좋을까요?
: : (charset도 바꿔봤는데 잘 안되네요...)
: :
: : 또, INTEGER 필드의 값을 쿼리상에서 다른 값으로 replace하고 싶은데,
: : 방법을 알려주시면 정말 고맙겠습니다.
: :
: : (예) 0 - 가, 1 - 나, 2 - 다...
: :
: : num
: : ---
: : 0
: : 1
: : 2
: : ===
: :
: : > ...쿼리...
: :
: : num
: : ---
: : 가
: : 나
: : 다
: : ===
: :
: : ...이렇게요... (설명이 좀 부족한 것 같습니다만...)
|