2016-07-27 177 views
0

我有一個有數千行的表。我需要檢查表中是否存在某些值。搜索SQL並返回true或false

我想列出所有我正在搜索的條形碼,如果有的話返回true或false標誌。

我想出了這個至今:

SELECT CASE WHEN EXISTS (
    SELECT * 
    FROM TABLE 
    WHERE Coulmn in ('a','b', 'c', 'd', 'e', 'f', 'g') 
) 
THEN CAST(1 AS BIT) 
ELSE CAST(0 AS BIT) END 

然而,這只是返回所以在表1.

值我有

coulmn 
---------- 
A 
B 
D 
E 
F 
G 

我想做的事情搜索返回以下內容

Coulmn | Exsists 
----------------- 
A  | True 
B  | True 
C  | False 
D  | True 
E  | True 
F  | True 
G  | True 
+3

添加一些示例表數據和預期結果! – jarlh

+0

我不明白,你想要1變成真,0變成假?如果它是你想要的,SQL Server不能使用True或False,但是使用位1和0.如果你想要True或False,它們必須是VARCHAR。 – caiohamamura

+1

請閱讀[**如何提問**](http://stackoverflow.com/help/how-to-ask) \t \t這裏是一個偉大的地方[** START **]( http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)瞭解如何提高您的問題質量並獲得更好的答案。 –

回答

0

在上面的幫助表格中,我創建了一個臨時表,然後實現了其中的一個共享。

CREATE TABLE #Temp 
(
     Barcode VARCHAR (100) 
) 
INSERT INTO #Temp 
VALUES 
(1), 
(2), 
(3), 
(4) 
select barcode, case when exists 
    (select * from CIPKORHHTProductDetails where CIPKORHHTProductDetails.Barcode = #temp.barcode) 
    then 'True' else 'False' end as ExistsStatus 
from #temp order by ExistsStatus DESC 
0

這工作:

SELECT *, CASE WHEN (Column in ('1','2')) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END AS result_field 
FROM TABLE; 

注意:在PostgreSQL的

測試
+0

這不起作用,它會爲所有行返回0。如果不存在則爲1,如果不存在則爲0 – Legend1989

+0

它在PostgreSQL和SQL Server中同樣適用於我的測試表。 在Oracle中,它與: SELECT objectid,CASE WHEN(objectid in(1,2))then 1 ELSE 0 END as result_field FROM cml_via_ln; –

+0

他們想知道在你的例子中,1和2是否存在於數據集中......例如,響應應該是1 TRUE,2 FALSE。這個查詢做了相反的事情 - 它列出了表中的所有東西,並告訴你他們是否是你要找的東西;它有點倒轉。儘管關閉。 – Chipmonkey

0

您可以使用查詢類似如下:存在時

SELECT t1.v, 
     CASE WHEN t2.col IS NOT NULL THEN 'true' ELSE 'false' END AS Exists 
FROM (
    SELECT 'a' AS v UNION ALL SELECT 'b' UNION ALL SELECT 'c' UNION ALL SELECT 'd' 
    UNION ALL SELECT 'e' UNION ALL SELECT 'f' UNION ALL SELECT 'g') AS t1 
LEFT JOIN mytable AS t2 ON t1.v = t2.col 
+0

我收到了數千個需要查詢的項目,因此將它們全部單獨列出在select中可能是不可能的。 – Legend1989

+1

我懷疑他們只是需要圍繞'CASE'進行聚合包裝,以便每個'v'值將輸出減少到一行。 –

+1

@ Legend1989在這種情況下,您應該考慮使用您想要搜索的所有值填充臨時表並在類似上面的查詢中使用此表。 –

0

,因爲它是寫的,外部選擇是選擇的情況下()然後1其他0結束......所以它只會返回一行。外部選擇必須包括「列」和「存在」(選擇列,...)以返回兩列。

但是,「where」子句永遠不會像這樣返回「false」,因爲「列」必須位於真正的表中,以便查詢實際返回它。作爲@jarlh說,你需要一個幫手錶來存儲你要找的列:

Create table SearchColumns (SearchColumn char(1)); 
insert into SearchColumns (SearchColumn) 
    values ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H') 

然後,你可以做是否存在你的表從該表中看到,其值是與否在:

select SearchColumn, case when exists 
    (select * from TABLE where Table.Column = SearchColumns.SearchColumn) 
    then 'True' else 'False' end as ExistsStatus 
from SearchColumns 

我認爲這會得到你想要的。這將得到a)無論表中出現多少次,每列只有一條記錄,b)對於您要查找的每個列值,都爲「True」和「False」。如果你真的想要一個Bit,你可以使用0和1以及來自原始查詢的投射,但他們實際上顯示「0」和「1」;和c)無論你有多少價值,這都應該工作。 (注意,我假設其中一些是拼寫錯誤,所以我做了調整,但它們是一致的,所以我不確定)。

+0

如果您遇到這種情況,「SearchColumns」表也可能是臨時的。 – Chipmonkey