首页 > 解决方案 > 关于考虑类似语句的 SQL 查询

问题描述

我正在尝试根据所涉及的文本添加一列是/否。如果 Value 列包含 BALL,我们在列中将其标记为 Yes。但如果“球”附有任何文本/字符串,它应该将其返回为“否”。我附上了一些案例

请在此处查看示例

如何形成案例语句,以便如果任何文本/字符串附加到没有空格的“BALL”应该是“否”,其余所有案例都应该是“是”。我尝试使用 like %BALL%,但它不能满足上面屏幕截图中的所有示例。

标签: mysqlsql

解决方案


设置@val带有值的变量需要查找:

SET @val := 'BALL';

使用两种类型的检查运行查询:

  1. 用于在表LOCATE中查找@val值;将返回搜索值的第一个字符的数字位置。
  2. 用于从列SUBSTRING中获取两组值;string_val使用通过以下方式获得的数字位置LOCATE
    • val1将返回string_val搜索到的值之前的值@valLOCATE结果需要减1)。
    • val2将返回该string_val匹配项的值@val及其之后的任何内容。
  3. 在外部查询中,使用 .chk1检查提取到的最后一个字符val1与字母表REGEXP。在这种情况下GOBALL,将返回 true ( 1),9232BALL9232BALLV将返回 false ( 0)。在这里,我们将看看任何错误。
  4. chk2检查是否val2匹配搜索到的@val. 9232BALL因此,最终获得BALLfor的分离值val2将返回 true ( 1),而9232BALLV最终获得BALLVforval2将返回 false ( 0)。在这里,我们将看看什么是真的。
  5. 最后一个过滤器正在检查添加的chk1+chk2. 我们正在寻找的结果是1因为chk1需要为假 ( 0) 并且chk2需要为真 ( 1)。
SELECT String_val AS 'Value',
       CASE WHEN chk1+chk2=1 THEN 'Yes' ELSE 'No' END AS 'Yes/No'
FROM
(SELECT *,
       RIGHT(val1,1) REGEXP '[a-zA-Z]' AS chk1,
       val2=@val AS chk2
  FROM
(SELECT string_val,
        SUBSTRING(string_val,1,LOCATE(@val,string_val)-1) val1,
        SUBSTRING(string_val,LOCATE(@val,string_val)) val2
FROM mytable) A) B

编辑:

或者

SELECT string_val, 
       CASE WHEN 
       REGEXP_REPLACE(CASE WHEN val1 REGEXP '[a-zA-Z]$' = 1 
                      THEN CONCAT(val1,val2) ELSE val2 END,'[0-9]','')=@Val 
       THEN 'Yes' ELSE 'No' END AS 'Yes/No'
  FROM
(SELECT string_val,
        SUBSTRING(string_val,1,LOCATE(@val,string_val)-1) val1,
        SUBSTRING(string_val,LOCATE(@val,string_val)) val2
FROM mytable) A;

编辑2:

我的进一步测试表明,使用REGEXP_SUBSTR和更短的查询可以获得结果:

SET @val := 'BALL';

SELECT string_val, 
       REGEXP_SUBSTR(string_val, '[a-zA-Z]+[BALL]+[a-zA-Z]') AS vals,
      IF(((SELECT vals))=@val,'YES','NO') AS 'Yes/No'
FROM mytable;

演示


推荐阅读