dijous, 1 de març de 2007

DB2 tips....

Cosetes de DB2 que estic aprenent ara que hem toca fer servir el SGBD de IBM. Fins ara ho tenia apuntat a la llibreta, però com que me la demanen contiunament o apunto aqui sota:

Obtenir les 10 millors tuples d'una taula:
Aquesta instrucció no se si també estava disponible a Oracle, però va molt bé per obtenir els primers n elements d'una consulta.

SELECT *
FROM ...
WHERE ...
ORDER BY ...
FETCH FIRST 10 ROWS ONLY;

NVL per DB2:
A DB2 el NVL d'Oracle no existeix, i en lloc seu cal utilizar la sentència COALESCE que retorna el primer element no null de la llista de valors

SELECT COALESCE(VAL1, VAL2);
FROM...


que equival a:

if (val1!=null) then val1
else if (val2!=null) then val2

Decode per DB2:
El decode tampoc no existeix a DB2, però com a alternativa es pot utilitzar l'operador CASE, que la veritat trobo molt més comode que el DECODE d'Oracle. Com podeu veure, el decode és casi com un if:

SELECT CASE x WHEN 1 THEN 'un'
WHEN 2 THEN 'dos'
ELSE 'ni un ni dos'
END
FROM ...

sysdate per DB2:
A DB2 tampoc no hi ha el sysdate i en lloc seu hi ha la instrucció: CURRENT DATE.

SELECT ...
FROM ...
WHERE data < CURRENT DATE and any = YEAR(CURRENT DATE)

interessant veure també les consultores que hi ha sobre dates.

Obtenir el següent valor d'una sequència:

SELECT nextval FOR sequencia
FROM SYSIBM.SYSDUMMY1;

El que es pot vaure també en aquesta expressió, és que
SYSIBM.SYSDUMMY1 es l'equivalent a la taula DUAL d'Oracle.

i en fer un insert:

INSERT INTO ... VALUES (
nextval FOR sequencia , ...);

Obtenir el rowid d'una fila:
En db2 la sequència és la següent:

SELECT ..., ROW_NUMBER() OVER(),...
FROM ...


I més coses que aniré afegint en aquesta matèxia entrada o en d'altres.