Partager l'article ! Reversing a string: Bon, l'autre jour, mon chef me demandait : sais tu pallindromer une chaîne de caractères sans fonction PL ?   ...
Bon, l'autre jour, mon chef me demandait : sais tu pallindromer une chaîne de caractères sans fonction PL ?
... merci google, il y a une built-in fonction :)
1) Fonction REVERSE
Attendez, un petit jeu de test d'abord :
SQL> CREATE TABLE testrev(txt VARCHAR2(255));
Table crÚÚe.
SQL> INSERT INTO testrev VALUES ('marcel');
1 ligne crÚÚe.
SQL> INSERT INTO testrev VALUES ('robert');
1 ligne crÚÚe.
SQL> INSERT INTO testrev VALUES ('cosmetic sql is good for
you');
1 ligne crÚÚe.
SQL> commit;
Validation effectuÚe.
Et hop :
SQL> SELECT txt, reverse(txt) rev
2 FROM testrev;
TXT
REV
marcel
lecram
robert
trebor
cosmetic sql is good for
you uoy rof doog si lqs citemsoc
Surprise, ça marche !
Mais bon, c'est pas très drôle, disons le.
EDIT : et en plus la fonction n'est pas supportée, et elle est limitée dans un certain nombre de cas (Cf. le commentaire de Laurent)
Ben on va essayer de le faire à la main quand même !
2) Encore de la clause MODEL !
Alors, dans la mesure où on est capable de faire de l'itératif avec la clause MODEL, on devrait y arriver :
Il suffit d'itérer, pour chaque ligne, sur la longueur de la chaine, et construire le résultat.
SQL> SELECT txt, rev
2 FROM (
3 SELECT txt, length(txt) lng, length(txt) cnt
4 FROM testrev
5 ) t
6 MODEL
7 PARTITION BY (ROWID)
8 DIMENSION BY (0 n)
9 MEASURES (txt, lpad(' ', lng) rev, lng, cnt)
10 RULES
11 ITERATE(1000000) UNTIL (cnt[0] = 0)
12 (
13 rev[0] = substr(rev[0], 1, iteration_number) || substr(txt[0], lng[0] - iteration_number, 1)
14 , cnt[0] = cnt[0] -1)
15 /
TXT
REV
cosmetic sql is good for
you uoy rof doog si lqs citemsoc
marcel
lecram
robert
trebor
La question que je me pose encore cela dit : mais à quoi ça sert de pallindromer ?
Pfiou, heureusement que ce blog ne sert à rien...
| Mai 2012 | ||||||||||
| L | M | M | J | V | S | D | ||||
| 1 | 2 | 3 | 4 | 5 | 6 | |||||
| 7 | 8 | 9 | 10 | 11 | 12 | 13 | ||||
| 14 | 15 | 16 | 17 | 18 | 19 | 20 | ||||
| 21 | 22 | 23 | 24 | 25 | 26 | 27 | ||||
| 28 | 29 | 30 | 31 | |||||||
|
||||||||||
SQL> select reverse('bébé') from dual;
REVERSE('
---------
¿¿¿¿¿¿
SQL> select reverse('ça va bien') from dual;
ERROR:
ORA-29275: partial multibyte character
no rows selected
SQL> select VALUE from nls_database_parameters where parameter='NLS_CHARACTERSET';
VALUE
-----------
AL32UTF8
Merci pour la précision Laurent, je vais faire un petit update !
(Bien que je pense que personne ne s'intéressera jamais à ce truc :D)