2
votes

SQL Si la valeur existe, affichez une colonne et affichez oui à l'intérieur

Je veux écrire une requête pour ajouter une nouvelle colonne s'il y a des données dans l'une des colonnes du nom du score s'il n'y a pas de données pour certaines de ses lignes dans le tableau, la requête doit créer une colonne et afficher " no "mais s'il y a des données là-dedans, il devrait afficher" oui "comme ci-dessous.

Tableau

Name      Phone     Score    new_column
Ali       1111      90       yes
Karim     2222      80       yes
Ramin     33333     10       yes
Millad    3333               no
Rawof     5555               no

Après la requête, il devrait afficher

Name      Phone     Score    
Ali       1111      90
Karim     2222      80
Ramin     33333     10
Millad    3333      
Rawof     5555      


1 commentaires

Puis-je vous demander pourquoi vous voulez faire cela? En général, cela me semble être une mauvaise idée car alors vous aurez deux sources de vérité pour cette propriété, maintenant lorsque vous mettez à jour une ligne, vous devez (vraisemblablement) vous assurer que new_column continue d'être correcte.


4 Réponses :


2
votes

Vous pouvez essayer d'utiliser CASE WHEN avec la fonction de fusion.

SELECT t1.*,(CASE WHEN t1.Score IS NOT NULL THEN 'yes' else 'no' end) as new_column
FROM T t1

Modifier

Dans le document Oracle sur NULL

Oracle Database traite une valeur de caractère avec une longueur de zéro comme nulle.

SELECT *,CASE WHEN coalesce(Score,'') <> '' THEN 'yes' else 'no' end 'new_column'
FROM T


6 commentaires

me battre de 30 secondes


lorsque j'essaie cela dans la section de commande oracle apex SQL, il lance une erreur ORA-00923: mot clé FROM non trouvé à l'endroit prévu


@MelladQarizada Vous pouvez essayer d'utiliser le nom de votre table au lieu de T


Vous devrez préfixer * , par exemple t. * .


Cependant, <> '' ne sera jamais vrai s'il s'agit d'Oracle. De plus, Oracle n'a pas besoin de crochets autour des expressions de la liste de sélection, et les guillemets doubles forcent simplement le nom de la colonne en minuscules (bien que ce soit peut-être ce que l'OP voulait).


@WilliamRobertson Merci pour votre rappel que je modifie ma réponse :)



1
votes

Vous pouvez essayer d'utiliser CASE WHEN Expression

select name, phone, score, case when score is null or score='' then 'no' else 'yes' end
from tablename


1 commentaires

@MelladQarizada, si cela vous a aidé, veuillez le marquer comme réponse acceptée :)



0
votes
DECLARE @table AS TABLE
(
    [Name] VARCHAR(32),
    Phone VARCHAR(16),
    Score int
)
INSERT INTO @table
VALUES
('Ali', '1111', 90),
('Karim', '2222', 80),
('Ramin', '33333', 10),
('Millad', '3333', NULL ),
('Rawof', '5555', NULL)

SELECT
    [Name],
    Phone,
    CASE
        WHEN SCORE IS NULL THEN 'no'
        ELSE 'yes' 
    END as new_column
FROM
    @table

0 commentaires

0
votes

Vous pouvez utiliser case , nvl2 ou decode.

create table demo (name, phone, score) as
select 'Ali',    1111,  90   from dual union all
select 'Karim',  2222,  80   from dual union all
select 'Ramin',  33333, 10   from dual union all
select 'Millad', 3333,  null from dual union all
select 'Rawof',  5555,  null from dual;

alter table demo add new_column generated always as (case when score is null then 'no' else 'yes' end);

select * from demo;

NAME                                PHONE      SCORE NEW_COLUMN
------------------------------ ---------- ---------- ----------
Ali                                  1111         90 yes
Karim                                2222         80 yes
Ramin                               33333         10 yes
Millad                               3333            no
Rawof                                5555            no

5 rows selected.

nvl2 code> est le plus compact, mais c'est un peu cryptique. Je choisirais probablement moi-même case .

Si vous voulez que cette expression soit disponible en permanence, vous pouvez en faire une colonne virtuelle:

select name, phone, score
     , case when score is null then 'no' else 'yes' end as new_column1
     , nvl2(score,'yes','no') as new_column1
     , decode(score, null,'no', 'yes') as new_column3
from   demo;


0 commentaires