使用 UNION 和 <condition> 选择以 A 到 K 开头的名称
Posted
技术标签:
【中文标题】使用 UNION 和 <condition> 选择以 A 到 K 开头的名称【英文标题】:Using UNION and <condition> to select Names starting with A to K 【发布时间】:2021-06-21 11:07:33 【问题描述】:我正在解决挑战。有2张桌子:
Fruit
与列 FriutID
和 Name
和表 Vegetables
与列 VegetableID
和 Name
我需要输出以字母 A 到 K 开头的所有水果和蔬菜的列表。换句话说,所有不以字母 L 到 Z 开头的水果和蔬菜。
我正在使用UNION
,但我不知道如何使用LIKE "selection criteria"
select Name from fruit where Name LIKE BETWEEN "A%" AND "K%"
UNION
select Name from vegetable where Name LIKE BETWEEN "A%" AND "K%";
我的第二次尝试:
select Name from fruit where Name LIKE "A%" AND LIKE "B%" AND LIKE "C%" AND LIKE "D%" AND LIKE "E%" AND LIKE "F%" AND LIKE "G%"
AND LIKE "H%" AND LIKE "I%" AND LIKE "J%" AND LIKE "K%"
UNION
select Name from vegetable where Name LIKE "A%" AND LIKE "B%" AND LIKE "C%" AND LIKE "D%" AND LIKE "E%" AND LIKE "F%" AND LIKE "G%"
AND LIKE "H%" AND LIKE "I%" AND LIKE "J%" AND LIKE "K%";
返回语法错误:SQL Error: near ""B%"": syntax error
请提出解决方案如何解决这个问题, 亲切的问候, 安娜
【问题讨论】:
【参考方案1】:第二次尝试你已经接近了。但是您需要使用OR
——名称可以以一个字母开头,也可以同时以另一个字母开头。而且你需要使用完整的LIKE
操作——你不能使用第一个操作数超过一个第二个操作数。
SELECT name
FROM fruit
WHERE name LIKE 'A%'
OR name LIKE 'B%'
...
OR name LIKE 'J%';
OR name LIKE 'K%'
UNION
SELECT name
FROM vegetable
WHERE name LIKE 'A%'
OR name LIKE 'B%'
...
OR name LIKE 'J%';
OR name LIKE 'K%';
还要注意UNION
消除了重复。如果您不需要或不想这样做,请改用UNION ALL
。
【讨论】:
非常感谢@sticky bit,就像魔术一样!【参考方案2】:代替LIKE
(不能与运算符BETWEEN
一起使用),使用SUBSTR()
获取每个Name
的第一个字母,并检查它是否在'A'
和'K'
之间:
SELECT Name FROM fruit WHERE UPPER(SUBSTR(Name, 1, 1)) BETWEEN 'A' AND 'K'
UNION ALL
SELECT Name FROM vegetable WHERE UPPER(SUBSTR(Name, 1, 1)) BETWEEN 'A' AND 'K';
或使用GLOB
运算符:
SELECT Name FROM fruit WHERE Name GLOB '[A-Ka-k]*'
UNION ALL
SELECT Name FROM vegetable WHERE Name GLOB '[A-Ka-k]*';
【讨论】:
谢谢,逻辑我明白了。解决了挑战,所以不要让我尝试使用 SUBSTR 或 GLOB 解决方案。也许下次我看到类似的任务时我会尝试。非常感谢!以上是关于使用 UNION 和 <condition> 选择以 A 到 K 开头的名称的主要内容,如果未能解决你的问题,请参考以下文章
JOIN then UNION vs. UNION then JOIN 的表现