我有一个如下所示的表
我希望创建two new binary columns
,指示主题是否具有steroids
和aspirin
。
我试了下面的方法,但不起作用
select subject_id
case when lower(drug) like ('%cortisol%','%cortisone%','%dexamethasone%')
then 1 else 0 end as steroids,
case when lower(drug) like ('%peptide%','%paracetamol%')
then 1 else 0 end as aspirin,
from db.Team01.Table_1
SELECT
db.Team01.Table_1.drug
FROM `table_1`,
UNNEST(table_1.drug) drug
WHERE REGEXP_CONTAINS( db.Team01.Table_1.drug,r'%cortisol%','%cortisone%','%dexamethasone%')
我希望输出如下所示
6条答案
按热度按时间qij5mzcb1#
以下是BigQuery标准SQL
如果要应用于问题中示例数据-结果为
注意:我使用
LIKE on steroids
,而不是以冗长冗余的文本结尾的简单LIKE,它是REGEXP_CONTAINSyws3nbqq2#
在Postgres中,我建议使用
filter
子句:在BigQuery中,我建议使用
countif()
:您可以使用
sum(case when . . . end)
作为一种更通用的方法。然而,每个数据库都有一种更“本地”的方式来表达这种逻辑。顺便说一下,FILTER
子句 * 是 * 标准SQL,只是没有被广泛采用。pokxtpni3#
使用条件聚集。此解决方案适用于大多数(如果不是全部)RDBMS:
NB:不清楚为什么要使用
LIKE
,因为看起来好像有完全匹配的内容;我把LIKE
条件转化为等式。k75qkfdt4#
您缺少
group-by
使用
like
关键字cunj1qz15#
另一个可能更直观的解决方案是使用BigQuery Contains_Substr返回布尔结果。
holgip5t6#
我没有使用过BigQuery,但一直在阅读研究它的文档。我在设计阶段研究选择排序规则的影响时遇到了这个问题。
我要么错了,要么这是一个新的功能,因为上面的答案。
包含_替代品
https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#contains_substr
执行规范化的、不区分大小写的搜索,以查看表达式中是否存在作为子字符串的值。如果值存在,则返回TRUE,否则返回FALSE。
在比较值之前,使用NFKC规范化对值进行规范化和大小写折叠。不支持通配符搜索。