我正在尝试解决sqlzoo中的问题,我们提供了一个包含国家/地区名称,大陆,区域,人口和gdp的表格。问题是要显示名称和大陆 - 但用欧亚大陆代替欧洲和亚洲;替代美国 - 北美或南美洲或加勒比地区的每个国家。显示以A或B开头的国家/地区 当我使用以下查询时,它工作正常:
select name, case
when continent in ('europe', 'asia') then 'Eurasia'
when continent in ('north america', 'south america', 'caribbean') then 'America' else continent end as continent
from world where name like 'A%' or name like 'B%'
但是如果想使用以下代码则无法正常工作:
select name, case
when continent in ('europe', 'asia') then 'Eurasia'
when continent in ('north america', 'south america', 'caribbean') then 'America' else continent end as continent
from world where name like in ('A%', 'B%')
唯一的区别是我将名字放在一个括号中。我可以不在“in”中使用“like”吗?
答案 0 :(得分:1)
不,你不能这样做。 LIKE
和IN
是不同的运营商。你不能按照你想要的方式组合它们。
答案 1 :(得分:0)
LIKE
仅适用于常量(字符串,日期,数字)。
您可以使用正则表达式执行所需操作:
where name regexp '^[AB].*$'
注意:您可以将此简化为name regexp '^[AB]'
,因为正则表达式会在字符串中的任何位置查找匹配项。但是,我喜欢在SQL中使用正则表达式时保持语义与like
相同,因此我强制匹配整个字符串。
答案 2 :(得分:0)
你不能将这两种模式混合在一起,但是你可以将各种LIKE
模式放到一个表中(临时表,如果这适合你正在做的事情),然后{{ 1}}关闭:
JOIN
SELECT
name,
case
when continent in ('europe', 'asia') then 'Eurasia'
when continent in ('north america', 'south america', 'caribbean') then 'America'
else continent
end as continent
FROM
World W
INNER JOIN Name_Patterns NP ON W.name LIKE NP.name_pattern
只需要一个列,其中包含要搜索的每个模式的行。如果这些更改为每个调用,那么临时表可能是适当的,在运行中构建。如果这些是提前配置的,那么实际的表更有意义。
如果您的模式仅限于一两个,那么您最好只构建Name_Patterns
子句:
WHERE