【问题标题】:substring_index() returns wrong result in MySQLsubstring_index() 在 MySQL 中返回错误的结果
【发布时间】:2021-12-21 23:14:04
【问题描述】:

我在使用substring_index 时遇到了错误的返回。
您可以使用以下查询重现我的数据:

create schema Airport;
use Airport;


create table aircrafttype(
aircrafttypeid char(2),
aircrafttypename varchar(20),
primary key(aircrafttypeid));

create table aircraft(
aircraftid char(2),
aircraftpurdate date,
aircraftseatcap numeric(3),
aircrafttypeid char(2),
primary key(aircraftid),
foreign key(aircrafttypeid) references aircrafttype(aircrafttypeid));

create table hangar(
hangarid char(2),
hangarlocation varchar(20),
hangarstoragecap numeric(2),
primary key(hangarid));

create table serviceteam(
teamid char(2),
teamname varchar(20),
teamlevel numeric(1),
primary key(teamid));

create table service(
serviceid char(3),
servicedate date,
hangarid char(2),
aircraftid char(2),
teamid char(2),
primary key(serviceid),
foreign key(hangarid) references hangar(hangarid),
foreign key(aircraftid) references aircraft(aircraftid),
foreign key(teamid) references serviceteam(teamid));


insert into aircrafttype values ('B7','Boeing 777');
insert into aircrafttype values ('B3','Boeing 737');
insert into aircrafttype values ('B8','Boeing 787');
insert into aircrafttype values ('B6','Boeing 767');
insert into aircrafttype values ('22','Airbus 220');
insert into aircrafttype values ('31','Airbus 310');

insert into aircraft values('A1','2012-06-19',140,'B3');
insert into aircraft values('A2','2013-08-14',129,'B6');
insert into aircraft values('A3','2013-05-01',104,'B3');
insert into aircraft values('A4','2017-04-19',296,'B7');
insert into aircraft values('A5','2018-03-02',120,'B6');
insert into aircraft values('A6','2014-10-19',191,'31');
insert into aircraft values('A7','2015-10-03',198,'31');
insert into aircraft values('A8','2016-12-31',204,'22');
insert into aircraft values('A9','2017-01-01',173,'22');


insert into hangar values('H1','Sydney, NSW',7);
insert into hangar values('H2','Melbourne, VIC',22);
insert into hangar values('H3','Sydney, NSW',25);
insert into hangar values('H4','Brisbane, QLD',8);
insert into hangar values('H5','Launceston, TAS',14);

insert into serviceteam values('T1','Sydney Rabbitohs',5);
insert into serviceteam values('T2','Melbourne Rebels',3);
insert into serviceteam values('T3','Queensland Reds',5);
insert into serviceteam values('T4','Team TRU',4);

insert into service values('S1','2019-09-25','H3','A3','T1');
insert into service values('S2','2019-08-27','H2','A7','T2');
insert into service values('S3','2019-09-22','H5','A7','T4');
insert into service values('S4','2019-05-13','H5','A4','T4');
insert into service values('S5','2019-01-08','H1','A4','T1');
insert into service values('S6','2019-09-07','H4','A9','T3');
insert into service values('S7','2019-12-20','H3','A9','T1');
insert into service values('S8','2019-12-20','H4','A3','T3');
insert into service values('S9','2019-05-18','H4','A2','T3');
insert into service values('S10','2019-05-14','H3','A3','T1');
insert into service values('S11','2019-05-27','H3','A3','T1');
insert into service values('S12','2019-08-11','H3','A9','T1');
insert into service values('S13','2019-08-17','H4','A2','T3');
insert into service values('S14','2019-12-14','H4','A4','T3');
insert into service values('S15','2025-01-25','H5','A1','T4');

现在,我想:

如果飞机已在新南威尔士州的任何机库维修过,请打印所有维修详情。

所以我尝试使用substring_index,但它给了我一个空的回报,这是不正确的。这是我使用的代码:

select s.*, hangarlocation
from service s, hangar h
where s.hangarid = h.hangarid
and SUBSTRING_INDEX(hangarlocation, ',', -1) = 'NSW';

谁能帮我指出这里出了什么问题?

【问题讨论】:

  • 这里的sql-server标签不对吧?
  • spaceNSW(这是子字符串索引返回的内容)与 NSW 不一样,要么 TRIM 要么在测试中包含空格,
  • 您的机库位置在分隔符后包含一个空格,所以substring_index 的结果当然是' NSW'
  • 谢谢@P.Salmon!解决这个问题,它就像一个魅力:)
  • @derpirscher 您的回答类似于 P.Salmon。非常感谢您指出这一点!!它现在可以工作了:D

标签: mysql substring


【解决方案1】:

假设位置最后总是有状态名称,你可能会使用“like”而不是子字符串

select s.*, hangarlocation
  from service s, 
       hangar h
 where s.hangarid = h.hangarid
   and hangarlocation like '%, NSW';

并且推荐使用JOIN-syntax。这可以帮助您避免意外交叉连接等错误,并且更具可读性

select s.*, hangarlocation
  from service s
  join hangar h
    on s.hangarid = h.hangarid
 where hangarlocation like '%, NSW';

【讨论】:

  • 这两种代码我都试过了,而且效果很好!这是解决问题的另一种方法!非常感谢:)
【解决方案2】:

spaceNSW(这是子字符串索引返回的内容)与 NSW 不同,要么 TRIM 要么在测试中包含空格

https://www.db-fiddle.com/f/jWBxcfXZJ8HnUuGTBKYtrt/0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2014-02-20
    相关资源
    最近更新 更多