è possibile selezionare EXISTS direttamente come un po '?


186

Mi chiedevo se fosse possibile fare qualcosa del genere (che non funziona):

select cast( (exists(select * from theTable where theColumn like 'theValue%') as bit)

Sembra che dovrebbe essere fattibile, ma molte cose che dovrebbero funzionare in SQL no;) Ho visto delle soluzioni alternative per questo (SELEZIONA 1 dove ... esiste ...) ma sembra che dovrei essere in grado di cast il risultato della funzione esiste come un po 'ed essere fatto con esso.

Risposte:


267

No, dovrai usare una soluzione alternativa.

Se è necessario restituire un bit condizionale 0/1, un altro modo è:

SELECT CAST(
   CASE WHEN EXISTS(SELECT * FROM theTable where theColumn like 'theValue%') THEN 1 
   ELSE 0 
   END 
AS BIT)

O senza il cast:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END

16
Non è necessario il cast se si archivia il risultato in un tipo di dati Bit perché il cast è già implicito.
MikeTeeVee,

3
Ho appena provato questa tecnica, funziona alla grande. CAST to BIT non è necessario per recuperare i risultati dalla query, testati con SQL Server 2008 R2.
Tore Aurstad,

Nel mio caso il cast DEVE essere rimosso
Sérgio S. Filho il

51
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

Quando lanci in bit

  • 0 -> 0
  • tutto il resto -> 1
  • E NULL -> NULL ovviamente, ma non puoi ottenere NULL con COUNT (*) senza GROUP BY

bitsi associa direttamente ai booleantipi di dati .net, anche se in realtà non è ...

Sembra simile ma non dà riga (non zero) se non ci sono corrispondenze, quindi non è la stessa

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'

4
Ma questo non usa affatto ESISTI. Non stavo chiedendo come aggirare il problema, posso trovare soluzioni alternative, stavo chiedendo se ci fosse qualche trucco da usare esiste come un pezzo di cui non ero a conoscenza.
jcollum,

6
Questa non è una soluzione alternativa, è un modo corretto di impostare. ESISTE è questa soluzione alternativa ... E molto pulito, no?
gbn

1
@jcollum: sì, o qualcosa del genere. EXISTS è quasi sempre SE ESISTE o DOVE ESISTE e non viene utilizzato per l'output come stai cercando di fare
gbn

14
EXISTS è più efficiente di COUNT quando verifica l'esistenza di un record - vedi sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/…
Tahir Hassan,

9
Diversamente EXISTS, COUNTcontinuerà a cercare nei dati le righe corrispondenti anche dopo aver trovato il primo perché deve essere conteggiato.
IsmailS,

11

Sono un po 'in ritardo sull'accettazione per questo; appena inciampato nel post. Tuttavia, ecco una soluzione che è più efficiente e pulita rispetto alla risposta selezionata, ma dovrebbe fornire la stessa funzionalità:

declare @t table (name nvarchar(16))
declare @b bit

insert @t select N'Simon Byorg' union select N'Roe Bott'


select @b = isnull((select top 1 1 from @t where name = N'Simon Byorg'),0)
select @b whenTrue

select @b = isnull((select top 1 1 from @t where name = N'Anne Droid'),0)
select @b whenFalse

7

Puoi usare IIFeCAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
                       where theColumn like 'theValue%'), 1, 0) AS BIT)

1
Mi piace, ma funziona solo in SQL Server 2012 e versioni successive. Sembra che IIF sia stato aggiunto nel 2012
ja928,

5

Puoi anche fare quanto segue:

SELECT DISTINCT 1
  FROM theTable
 WHERE theColumn LIKE 'theValue%'

Se non ci sono valori che iniziano con 'theValue', questo restituirà null (nessun record) invece di un bit 0


2

No non è possibile. Il tipo di dati bit non è un tipo di dati booleano. È un tipo di dati intero che può essere 0,1 o NULL.


3
@bzlm Sì, può funzionare in SQL Server per oltre 10 anni. SQL Server 7.0 lo ha introdotto msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx
Martin Smith,

4
@bzlm - Sembra che tu ti stia stringendo a botte e non mi sappia davvero nulla sui tipi di dati di SQL Server. La definizione di bit in SQL Server è "Un tipo di dati intero che può assumere un valore di 1, 0 o NULL." msdn.microsoft.com/en-us/library/ms177603.aspx . Questo vale per le colonne e le variabili Transact SQL. Da nessuna parte una variabile di bit può essere utilizzata come booleana in SQL, IF(@TRUE)ad esempio, né viceversa un'espressione booleana può essere forzata in un po '. (Con es. SET @BitVariable = (1=1))
Martin Smith,

1
Vedo dove stai andando, ma il casting a bit non era tanto il problema quanto la possibilità di selezionare direttamente ESISTI.
jcollum,

1

Un'altra soluzione è quella di utilizzare ISNULLin tandem con SELECT TOP 1 1:

SELECT ISNULL((SELECT TOP 1 1 FROM theTable where theColumn like 'theValue%'), 0)

-1

Credo che esista possa essere usato solo in una clausola where, quindi dovrai fare una soluzione alternativa (o una sottoquery con esiste come clausola where). Non so se questo conta come una soluzione alternativa.

Che dire di questo:

create table table1 (col1   int null)
go
select 'no items',CONVERT(bit, (select COUNT(*) from table1) )   -- returns 'no items', 0
go
insert into table1 (col1) values (1)
go
select '1 item',CONVERT(bit, (select COUNT(*) from table1) )     --returns '1 item', 1
go
insert into table1 (col1) values (2)
go
select '2 items',CONVERT(bit, (select COUNT(*) from table1) )    --returns '2 items', 1
go
insert into table1 (col1) values (3)
go
drop table table1
go

Che dire del caso whens in una selezione?
tasto inferiore

-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.