0
votes

Sélectionnez Données dans lesquelles des correspondances de condition et, si aucune, puis sélectionnez tout?

declare @id varchar(12) = 'user1'
declare @var int = (select count(*) from table1 where [user] = @id)

select * from table1 where [user] = @id or @var = 0

3 commentaires

Quelle est votre question ici exactement? Pouvez-vous expliquer ce que sont ces scénarios? Qu'est-ce que tu as essayé jusque-là?


J'ai besoin d'une requête qui sélectionnera toutes les données si l'utilisateur n'existe pas dans la table. S'il y a, sélectionnez uniquement uniquement les données correspondant. Je vais éditer mon contenu. J'espère que cela aiderait.


Aucune aide. Je ne peux pas faire une requête qui serait plus utile. laissez-moi donner à ma requête existante


6 Réponses :


0
votes

Vous devrez peut-être faire un chèque d'abord quelque chose comme celui-ci xxx


2 commentaires

C'est faisable. Mais je finirai par manger de la RAM juste en sélectionnant le nombre de données avant de faire le code. Nous parlons de gros nombre de données ici.


Ajouter un index sur la colonne utilisateur



1
votes
declare @tab table (id int , value varchar(10))
declare @id int = 4

insert into @tab
select 1,'Ajay'
union all
select 2,'Ajay1'
union all
select 3,'Ajay2'
union all
select 4,'Ajay3'
union all
select 5,'Ajay4'

select * from @tab 
where id = case when exists (select * from @tab where id = @id) then @id else id end

3 commentaires

Il ne va pas bien. Cela a fini par sélectionner toutes les données.


c'est bon. J'espère que le cas échéant est une tâche facile pour mon serveur lorsque ces données deviennent plus grandes et plus grandes. Merci


@ajespiritu - Créez un index sur la colonne utilisateur. Cela sera alors plus rapide lorsque la table devient grande avec plus d'utilisateurs.



2
votes
DECLARE @id VARCHAR(5) = 'user1';
--DECLARE @id VARCHAR(5) = 'user5';
  WITH  UsersAndDepartments
AS ( SELECT   *
    FROM     ( VALUES ( 'dept1', 'user1'), ( 'dept2', 'user2'),
            ( 'dept3', 'user3'), ( 'dept4', 'user4') ) x ( [department], [user] )
    )
SELECT  *
FROM    UsersAndDepartments ud1
WHERE   ud1.[user] = 
    CASE 
        WHEN EXISTS ( SELECT 1 FROM UsersAndDepartments ud2 WHERE ud2.[user] = @id ) THEN @id
        ELSE ud1.[user] 
    END
The above just checks on user column if any row exists for an id, else matches on all.

2 commentaires

Merci. Vous avez eu la même réponse que @ajay. Il vient de le faire tôt.


Acclamations. le monde appartient à ceux qui se lèvent tôt!



0
votes

Vous pouvez essayer ceci:

DECLARE @id varchar(12) = 'user1'

IF EXISTS(SELECT COUNT(*) FROM table1 WHERE [user] = @id)
BEGIN
SELECT * FROM table1 WHERE [user] = @id
END
ELSE
BEGIN
SELECT * FROM table1
END


0 commentaires

0
votes

Vous pouvez avoir un plan d'exécution légèrement meilleur si vous séparez la logique "si existent" de la requête réelle: xxx


0 commentaires

1
votes

Je ferais cela avec un simple ou , pas un cas expression dans le .

En général, vous voulez Évitez les expressions dans le clause pour plusieurs raisons:

  • La logique peut presque être écrite de manière concise en utilisant des opérations booléennes de base.
  • Ajout de constructions supplémentaires (en plus de et , ou , et non ) rend la logique plus difficile pour les gens à suivre.
  • Il tue à peu près tous les chemins d'optimisation.

    Je suggérerais: xxx


0 commentaires