Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查询类似字符串的MySQL字段_Mysql_Sql - Fatal编程技术网

查询类似字符串的MySQL字段

查询类似字符串的MySQL字段,mysql,sql,Mysql,Sql,我在MySQL数据库中有一个名为“areasCovered”的字段,其中包含邮政编码的字符串列表 有两行具有相似的数据,例如: Row 1: 'B*,PO*,WA*' Row 2: 'BB*, SO*, DE*' 注意-字符串没有任何特定顺序,可能会根据用户的不同而变化 现在,如果我使用如下查询: SELECT * FROM technicians WHERE areasCovered LIKE '%B*%' 我希望它只返回第一排。但是,它也返回第2行,因为字符串中有BB* 我怎样才能防止它

我在MySQL数据库中有一个名为“areasCovered”的字段,其中包含邮政编码的字符串列表

有两行具有相似的数据,例如:

Row 1: 'B*,PO*,WA*'
Row 2: 'BB*, SO*, DE*'
注意-字符串没有任何特定顺序,可能会根据用户的不同而变化

现在,如果我使用如下查询:

SELECT * FROM technicians WHERE areasCovered LIKE '%B*%'
我希望它只返回第一排。但是,它也返回第2行,因为字符串中有BB*


我怎样才能防止它这样做呢?

您在开始和结束时都在搜索外卡

你只需要在最后

SELECT * FROM technicians WHERE areasCovered LIKE 'B*%'

您在开始和结束时都在搜索通配符

你只需要在最后

SELECT * FROM technicians WHERE areasCovered LIKE 'B*%'

你可以按照编程学生建议的方式来做

从区域覆盖为“B*%”的技师处选择*

或者您也可以对查询使用限制


从技术人员处选择*,区域范围为“%B*%”限制1

您可以按照编程学员建议的方式执行

从区域覆盖为“B*%”的技师处选择*

或者您也可以对查询使用限制


从“%B*%”限制1这样的区域中选择*,
%B*%
每侧包含%,这使得返回文本任何位置的值包含
B*
的所有行,但您的要求是查找包含以
B*
开头的值的所有行,如下所示查询应该完成这项工作


从“B*%.”等区域中选择*
%B*%
每侧包含%,这使得它可以返回文本任何位置处value包含
B*
的所有行,但是您的要求是查找包含以
B*
开头的值的所有行,因此应执行以下查询做这项工作


从技师那里选择*,那里的区域被覆盖为“B*%”

我无法在我的机器上检查它,但它应该可以工作:

SELECT * FROM technicians WHERE areasCovered <> replace(areaCovered,',B*','whatever')
从覆盖更换区域的技师处选择*(覆盖区域,'、B*'、'任意')
如果“B*”不存在,则覆盖的区域将等于替换(覆盖的区域、”B*“、”任意“),并且它将拒绝该行。
如果存在“B*”,则areCovered将不适合替换(areCovered、“B*”、“任意”),并且它将接受该行。

我无法在我的机器上检查它,但它应该可以:

SELECT * FROM technicians WHERE areasCovered <> replace(areaCovered,',B*','whatever')
从覆盖更换区域的技师处选择*(覆盖区域,'、B*'、'任意')
如果“B*”不存在,则覆盖的区域将等于替换(覆盖的区域、”B*“、”任意“),并且它将拒绝该行。
如果存在“B*”,则areCovered将不适合替换(areaCovered,“,B*”,“任意”),它将接受该行。

在这种情况下,使用类似于
的关键是包含分隔符,因此您可以查找分隔值:

SELECT *
FROM technicians
WHERE concat(', ', areasCovered, ', ') LIKE '%, B*, %'
在MySQL中,您也可以使用
find_In_set()
,但空间可能会给您带来问题,因此您需要消除它:

SELECT *
FROM technicians
WHERE find_in_set('B', replace(areasCovered, ', ', ',') > 0

最后,您不应该将这些类型的列表存储为字符串。您应该将它们存储在一个单独的表中,一个连接表,每个技师和每个覆盖区域各一行。这使得这些类型的查询更易于表达,并且性能更好。

在这种情况下,使用类似于
的关键是要包含分隔符,以便您可以查找分隔值:

SELECT *
FROM technicians
WHERE concat(', ', areasCovered, ', ') LIKE '%, B*, %'
在MySQL中,您也可以使用
find_In_set()
,但空间可能会给您带来问题,因此您需要消除它:

SELECT *
FROM technicians
WHERE find_in_set('B', replace(areasCovered, ', ', ',') > 0

最后,您不应该将这些类型的列表存储为字符串。您应该将它们存储在一个单独的表中,一个连接表,每个技师和每个覆盖区域各一行。这使得这些类型的查询更容易表达,而且性能更好。

通常我讨厌REGEXP。但是,呵呵:

SELECT * FROM technicians 
WHERE concat(",",replace(areasCovered,", ",",")) regexp ',B{1}\\*';
解释一下:

摆脱讨厌的空间:

select replace("B*,PO*,WA*",", ",",");
select concat(",",replace("B*,PO*,WA*",", ",",")) regexp ',B{1}\\*';
在前面加一个逗号

select concat(",",replace("B*,PO*,WA*",", ",","));
使用正则表达式匹配“逗号B后跟星号”:

select replace("B*,PO*,WA*",", ",",");
select concat(",",replace("B*,PO*,WA*",", ",",")) regexp ',B{1}\\*';

通常我讨厌REGEXP。但是,呵呵:

SELECT * FROM technicians 
WHERE concat(",",replace(areasCovered,", ",",")) regexp ',B{1}\\*';
解释一下:

摆脱讨厌的空间:

select replace("B*,PO*,WA*",", ",",");
select concat(",",replace("B*,PO*,WA*",", ",",")) regexp ',B{1}\\*';
在前面加一个逗号

select concat(",",replace("B*,PO*,WA*",", ",","));
使用正则表达式匹配“逗号B后跟星号”:

select replace("B*,PO*,WA*",", ",",");
select concat(",",replace("B*,PO*,WA*",", ",",")) regexp ',B{1}\\*';

但是如果B*在字符串的中间,它找不到它?字符串的顺序不是按字母顺序排列的。所以它可能是:“D*,B*,所以*”但是如果B*在字符串的中间,它找不到它?字符串的顺序不是按字母顺序排列的。所以它可能是:'DE*,B*,So*'