IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Requêtes MySQL Discussion :

Transformer zero en rien. Le défi.


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    developpeur fichiers
    Inscrit en
    Janvier 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : developpeur fichiers
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2017
    Messages : 30
    Par défaut Transformer zero en rien. Le défi.
    Bonjour,

    question épineuse sur laquelle je ne trouve pas de réponses nulle part:

    SOIT :
    TRANSACTION_A de type varchar(80)

    NO_TRANSACTION_A_PRIMAIRE de type INTEGER


    Je veux que
    Transaction A : T0104544
    devienne
    NO_TRANSACTION_A_PRIMAIRE : 104544

    à la sortie de la requête.

    J’utilise dont cast (right(TRANSACTION_A,7) as int).


    LE PROBLÈME ... est que je ne veux pas avoir 0 quand la cellule est vide (je veux qu’elle reste vide). J’ai essayé plein de choses (IIF(), isnull() ), mais ça ne fonctionne pas. Je sais, oui : je transforme en INT, donc c’est logique qu’il veuille mettre un 0.

    Cependant, il y a sûrement moyen de remplacer les 0 par des cellules vides

    Cette requête donne des NULL au lieu de zéro. Malheureusement, quand j’ajoute la condition ISNULL… ça ne fonctionne pas par contre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
    case
    when transaction_A <> '' then
    cast (right(TRANSACTION_A,7) as int)
    --else isnull (cast(right(TRANSACTION_A,7) as int),'')
    end
    from maTable
    merci pour votre aide!!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    La question à se poser ici est la suivante :
    L'expression à retourner est-elle un nombre (sur lequel on effectuera des calculs) ou une chaîne de caractères composée uniquement de chiffres ?
    Si c'est un nombre, elle ne peut avoir que des valeurs numériques ou NULL. Si c'est une chaîne, cela peut être une chaîne vide.
    Pour rappel, une chaîne vide n'est pas NULL. (sauf pour Oracle qui ne respecte pas la norme)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre averti
    Femme Profil pro
    developpeur fichiers
    Inscrit en
    Janvier 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : developpeur fichiers
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2017
    Messages : 30
    Par défaut
    Merci pour la réponse rapide!

    En fait, je voudrais à la fin que ce soit une chaine de caractères, car je crois que c'est la seule façon d'obtenir une cellule "vide". Le résultat de la requete SQL est transformé ensuite en .csv, alors que ce soit en caractere ou numerique, ça n'a pas d'importance.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    la fonction normalisée pour ce faire est NULLIF.

    Exemple SELECT NULLIF(MaColonne, 0) donnera un NULL si la valeur est zéro.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre averti
    Femme Profil pro
    developpeur fichiers
    Inscrit en
    Janvier 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : developpeur fichiers
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2017
    Messages : 30
    Par défaut impossible?
    Plus ça va, plus je crois qu'il est impossible d'obtenir autre chose que NULL ou zero. La case vide semble impossible quand on est en numerique.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Ce que tu appelle la "CASE VIDE" c'est justement le marqueur NULL. NULL n'est pas une valeur, c'est un indicateur mathématique (donc pas une chaine de caractères) comme ∞ ou Ɛ (epsilon) qui indique une valeur très petite non mesurable...

    Il faudrait sans doute te former à SQL ce serait pas du luxe !

    Mon site web comme mes bouquins peuvent t'y aider...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 898
    Par défaut
    Salut à tous.

    D'après ce que j'ai compris, il s'agit de la création d'une nouvelle colonne avec récupération de la valeur d'une autre colonne et mise en forme.
    Puis Transformer la valeur zéro en marqueur NULL. Voici ce que je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `utf8`
            DEFAULT COLLATE       `utf8_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    create table `test`
    (  `ID`              integer unsigned not null auto_increment primary key,
       `TRANSACTION_A`   char(08)         not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`utf8` COLLATE=`utf8_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`TRANSACTION_A`) values
      ('T0104544'),('T1234567'),('T0000000')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+---------------+
    | ID | TRANSACTION_A |
    +----+---------------+
    |  1 | T0104544      |
    |  2 | T1234567      |
    |  3 | T0000000      |
    +----+---------------+
    --------------
    commit
    --------------
     
    --------------
    alter table `test` add column `NO_TRANSACTION_A_PRIMAIRE` integer null after `TRANSACTION_A`
    --------------
     
    --------------
    update `test` set `NO_TRANSACTION_A_PRIMAIRE` = case right(`TRANSACTION_A`, 7) when 0 then NULL else right(`TRANSACTION_A`, 7) end
    --------------
     
    --------------
    alter table `test` drop `TRANSACTION_A`
    --------------
     
    --------------
    commit
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+---------------------------+
    | ID | NO_TRANSACTION_A_PRIMAIRE |
    +----+---------------------------+
    |  1 |                    104544 |
    |  2 |                   1234567 |
    |  3 |                      NULL |
    +----+---------------------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Cette solution doit s'appliquer sur la totalité de la base en une fois.

    Reste maintenant, à modifier votre fichier ".csv".
    Comme vous n'utilisez plus la colonne `TRANSACTION_A`, il faudra modifier (de votre coté en mysql) le chargement de ce fichier dans votre table.
    Je suppose que vous reprenez telle quelle les valeurs dans le fichier ".csv" que vous placez dans les colonnes de votre table.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    LOAD DATA INFILE 'fichier.txt'
         INTO TABLE `trav`
         CHARACTER SET latin1
         FIELDS TERMINATED            BY ';'
                OPTIONALLY ENCLOSED   BY '\"'
                ESCAPED               BY '\\'
         LINES  TERMINATED            BY '\r\n'
         IGNORE 0 LINES
         (`ID`,`TRANSACTION_A`);
    Il suffit d'adapter votre "load data infile" en modifier la dernière ligne "(`ID`,`TRANSACTION_A`);" par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (ID, @F1))
    set `NO_TRANSACTION_A_PRIMAIRE` = case right(@F1, 7) when 0 then '\N' else right(@F1, 7) end;
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fast Fourier Transform - Zero Padding
    Par Youyayouyou dans le forum Traitement du signal
    Réponses: 2
    Dernier message: 17/05/2020, 01h36
  2. Réponses: 13
    Dernier message: 26/11/2018, 11h05
  3. Réponses: 2
    Dernier message: 17/02/2016, 16h53
  4. aide: lle code de la transformation 'tout ou rien'
    Par fdidiwa dans le forum Langage
    Réponses: 6
    Dernier message: 09/02/2011, 10h20
  5. transformation d'un zero
    Par ikeas dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 14/08/2008, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo