查询类似字符串的MySQL字段
我在MySQL数据库中有一个名为“areasCovered”的字段,其中包含邮政编码的字符串列表 有两行具有相似的数据,例如:查询类似字符串的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* 我怎样才能防止它
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*'