提问人:Tal1992 提问时间:4/18/2023 最后编辑:Tal1992 更新时间:4/18/2023 访问量:60
根据条件更改行
Change rows based on condition
问:
我有一个带有国家/地区列的表格,每个国家/地区都有多行。
我想查询 seq_no 等于 1 的行。但是,如果国家/地区是美国或加拿大,我希望seq_no等于 2,如下所示:
SELECT language
FROM table
WHERE IF(country = 'USA' OR 'Canada')
THEN (seq_no = '2')
ELSE (seq_no = '1')
ENDIF;
这可能吗?
答:
1赞
markalex
4/18/2023
#1
如果需要根据另一列对列应用不同的条件,可以在子句中使用。例如:case
where
SELECT *
FROM table
WHERE seq_no = CASE WHEN country in ('USA', 'Canada')
THEN '2'
ELSE '1' END;
输入:
国家 | seq_no |
---|---|
美国 | 2 |
加拿大 | 1 |
其他 | 1 |
输出:
国家 | seq_no |
---|---|
美国 | 2 |
其他 | 1 |
演示可以在这里看到。
评论
0赞
Tal1992
4/18/2023
如果我在表格中有美国和加拿大的多行,其中seq_no 1 和 2,会发生什么?
0赞
markalex
4/18/2023
@Tal1992,只有那些有 2 个的才会被选中。
0赞
Tal1992
4/19/2023
我收到此错误:Error while compiling statement: FAILED: SemanticException [Error 10014]: line 4:4 Wrong arguments ''1'': Unsafe compares between different types are disabled for safety reasons. If you know what you are doing, please set hive.strict.checks.type.safety to false and make sure that hive.mapred.mode is not set to 'strict' to proceed. Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features.
1赞
markalex
4/19/2023
@Tal1992,如果 your 是数字类型,请更改为 和 tp 。seq_no
'1'
1
'2'
2
1赞
Josh
4/18/2023
#2
您可以将 IF 条件转换为条件本身,如下所示:
SELECT
language
FROM
table
WHERE
(
(
country = 'USA'
OR country = 'Canada'
)
AND seq_no = 2
)
OR seq_no = 1
如果对这两个国家/地区使用 IN(),则可能更具可读性
SELECT
language
FROM
table
WHERE
( country IN('USA','Canada') AND seq_no = 2)
OR seq_no = 1
评论
seq_no
seq_no
country