我希望SET
在一列中将布尔值设置为True,但前提是相邻列中的值是唯一的(无论该值是什么)。
假设ROOM_IS_PRIVATE
是我设置的布尔列,ROOM_VALUE
是我想要检查其唯一性值的列。我写新查询相当新,所以这就是我到目前为止所做的:
SET ROOM_IS_PRIVATE = '1'
WHERE COUNT(ROOM_VALUE) = 1;
但这不适合我。我是否使用计数功能在正确的轨道上?
编辑:以下是我希望实现的结果示例:
| ROOM_VALUE | ROOM_IS_PRIVATE |
|--------------|-------------------|
| 54 | 0 |
| 13 | 1 |
| 08 | 0 |
| 08 | 0 |
| 54 | 0 |
| 19 | 1 |
| 08 | 0 |
如果第一列中的值对该列唯一,则第二列仅变为1
。
答案 0 :(得分:1)
请尝试这样 -
SELECT
ROOM_IS_PRIVATE = CASE WHEN COUNT(ROOM_VALUE) = 1 THEN 1 ELSE 0 END
FROM yourtableName
答案 1 :(得分:1)
尝试这样的条件更新:
update a set
a.ROOM_IS_PRIVATE= case when cnt is null then 1 else
a.ROOM_IS_PRIVATE end
from yourtable a
left join(
select roomvalue, count(*) cnt
from yourtable
group by roomvalue
having count(*)>1 )b
on a.roomvalue=b.roomvalue
答案 2 :(得分:1)
SET
子句看起来正确。但这不是一个有效的陈述;看起来我们错过了UPDATE
关键字,即我们正在更新的表格的名称。
如果我们想要修改room_value
唯一的行,我们可以这样做:
UPDATE mytable t
JOIN ( SELECT r.room_value
, COUNT(*) AS cnt
FROM mytable r
GROUP BY r.room_value
) s
ON s.room_value = t.room_value
SET t.room_is_private = CASE WHEN s.cnt = 1 THEN 1 ELSE t.room_is_private END
执行内联视图s
,并将结果具体化为派生表。这会为我们提供room_value
的不同值,以及具有相同room_value
的行数。
然后我们将派生的故事加回到原始表,在room_value
列上匹配,现在,对于表中的每一行,我们可以知道具有相同room_value
的行数。
在SET
子句中,我们使用的是一个测试计数的表达式,并有条件地指定1
(cnt=1
时),否则保留room_is_private
的值不变。
我怀疑当room_value不是唯一的时候我们可能也想设置room_is_private
= 0,所以我们不是将room_is_private
设置为当前值(即保持不变),而是指定一个0
。
UPDATE mytable t
JOIN ( SELECT r.room_value
, COUNT(*) AS cnt
FROM mytable r
GROUP BY r.room_value
) s
ON s.room_value = t.room_value
SET t.room_is_private = CASE WHEN s.cnt = 1 THEN 1 ELSE 0 END