使用 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 与列 FriutIDName

和表 Vegetables 与列 VegetableIDName

我需要输出以字母 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 的表现

XACML 编辑器使用 <Condition> 和字符串比较

使用 find 和 Union 检测 Graph 中的循环

如何用union合并SQL查询的数据

C结构体struct 和 共用体union的使用测试

Java并发编程之Condition