2016-07-27 133 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