Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DB2 Discussion :

Lister caractères non visibles en sql


Sujet :

DB2

  1. #1
    Membre du Club
    Lister caractères non visibles en sql
    Bonjour,
    J'ai une table dont certains champs ne sont pas visibles mais qui me font planter un traitement.
    Je ne le vois qu'en faisant un DSPPFM , il apparaît un '?' ou un carré en surbrillance; mais que je ne les vois pas par sql .

    Serait il possible de faire un SQL pour les lister?

    Merci!

  2. #2
    Expert éminent sénior
    bonjour,

    Pour visualiser le contenu des colonnes (et non pas des champs ) concernées, vous pouvez utiliser SELECT HEX(ma_colonne) FROM ma_table.

  3. #3
    Membre du Club
    Merci mais c'est une instruction qui transforme en hexa la valeur de ma colonne
    Je cherche à nettoyer la base et je pensais que l'instruction translate pouvait le faire.
    Mais ça coince

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT  TRANSLATE(monchamp , ' '   , x'00') from matable


    c'est le 3 ieme prédicat qui pose pbm . Je ne sais pas comment faire pour remplacer par un espace l'hexa x'00'.

    Une idée?

  4. #4
    Membre du Club
    Je pense avoir trouvé. En tous les cas ça marche our un code hexa.
    je suis passé par une expression régulière

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT monchamp ,regexp_replace(monchamp, '\00', 'x') from mytable


    Une fois exécuté j'ai bien un x qui apparaît à l'endroit ou se trouve mon hexa x'00'
    Je le remplace par ' ' et c'est bon.

    C'est encore à creuser. Le lien ci-dessous qui m'a permis de trouver une solution.
    Après un sql par code hexa c'est un peu galère


    https://www.volubis.fr/news/liens/co...m/SQL/SQL1.htm

  5. #5
    Membre du Club
    Après qq test il faut mettre s(minucule) ou W sinon selon on a des caractères qui sautent

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT monchamp,regexp_replace(monchamp, '[\s]', ' ') FROM mytable


    pour exemple

    \w tout caractère alpha ou numérique (pouvant constituer un mot)
    \W tout sauf caractère alpha ou numérique
    \d un chiffre
    \D tout sauf un chiffre
    \s caractère espace
    \S tout sauf un espace

    Mais on peut aussi combiner
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT monchamp,regexp_replace(monchamp, '[\d+\s]', ' ') FROM mytable


    A+

  6. #6
    Membre du Club
    Citation Envoyé par totofff78 Voir le message

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT  TRANSLATE(monchamp , ' '   , x'00') from matable

    c'est le 3 ieme prédicat qui pose pbm . Je ne sais pas comment faire pour remplacer par un espace l'hexa x'00'.
    Je ne comprends pas pourquoi vous dites que translate ne le fait pas, la requête ci-dessus retourne monchamp où tous les x'00' ont été remplacé par des x'40'
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT hex(TRANSLATE(x'00' , ' ', x'00')) resultat from sysibm.sysdummy1
    |--------|
    |40      |


    Si vous voulez remplacer plusieurs caractères par des blancs d'une instruction vous pouvez faire comme ceci

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with jeu_de_test (valeur) as (values (x'00'), (x'F000F101F202F303'))
    SELECT hex(valeur), hex(TRANSLATE(valeur , ' ', x'00010203', ' ')) from jeu_de_test
     
    |------------------|------------------|
    |0000              |4040              |
    |F000F101F202F30300|F040F101F202F30340|


    Si les données sont nombreuses je pense que c'est plus rapide qu'une expression régulière

    Attention cependant à des caractères comme la tabulation x'05', CRt x'0d' et LF x'25' qui ne sont peut être pas à remplacer si par exemple il y a une appli web qui accède à la table

    Je dis ça parce que dans les expressions régulière \s sélectionne ces caractères, donc si vous faite monchamp,regexp_replace(monchamp, '[\s]', ' ') vous remplacez les blancs par des blans et les tabulations par des blancs et les saut de lignes par des blancs

    Dernière chose, en expression régulière [\d+\s] ne signifie pas un chiffre ou un espace mais un chiffre ou un caractère '+' ou un espace

###raw>template_hook.ano_emploi###