我有一个BIT参数,如果在我的临时表的一列中存在两个值,我希望将其设置为1。
我在网上看了一下,大多数人建议使用CONTAINS功能,但是这需要我改变我的环境中的设置,这不是一个选项。在其他地方,我已经看到LIKE提到,但当我尝试过这是没有用的,因为我的目标是确保这两个值存在于列中,但因为LIKE是在逐行基础上工作,它不像我希望的那样工作。以下是目前为止的内容:
CREATE TABLE tempTable (Description nvarchar(100))
INSERT INTO tempTable
VALUES ('Word1'), ('Word2')
DECLARE @bValuesExist BIT
IF EXISTS(SELECT Description
FROM tempTable
WHERE Description LIKE 'Word1'
AND Description LIKE 'Word2')
SET @bValuesExist = 1
SELECT @bValuesExist
http://www.sqlfiddle.com/!18/7fbe1c/6
我希望从上面的代码片段得到的结果是bValuesExist变量被设置为true,因为两个值都存在于tempTable的描述列中。但是,代码目前正在检查描述列是否包含"Word1"one_answers";Word2"在一行一行的基础上,我怎么做这个检查,使它是在整个列上,而不仅仅是在行上?
Description LIKE 'Word1' AND Description LIKE 'Word2'
永远不能为真,因为一个列的值(标量值)不能同时为2个不同的值。这里需要的是HAVING
和条件聚合:
IF EXISTS(SELECT 1
FROM tempTable --This isn't a temporary table.
HAVING COUNT(CASE Description WHEN 'Word1' THEN 1 END) > 0
AND COUNT(CASE Description WHEN 'Word2' THEN 1 END) > 0)
SELECT 1;
如果我理解正确的话,您想要检查表中的值列表。一种方法使用聚合:
SET @bValuesExist = (SELECT (CASE WHEN COUNT(DISTINCT Description) = 2 THEN 1 ELSE 0 END)
FROM tempTable tt
WHERE Description in ('Word1', 'Word2')
);
2
为字数。DISTINCT
是为了考虑tempTable
中重复的可能性。
注意:这并不需要在代码中使用IF
。