mysql - 关于考虑类似语句的 SQL 查询
问题描述
我正在尝试根据所涉及的文本添加一列是/否。如果 Value 列包含 BALL,我们在列中将其标记为 Yes。但如果“球”附有任何文本/字符串,它应该将其返回为“否”。我附上了一些案例
如何形成案例语句,以便如果任何文本/字符串附加到没有空格的“BALL”应该是“否”,其余所有案例都应该是“是”。我尝试使用 like %BALL%,但它不能满足上面屏幕截图中的所有示例。
解决方案
设置@val
带有值的变量需要查找:
SET @val := 'BALL';
使用两种类型的检查运行查询:
- 用于在表
LOCATE
中查找@val
值;将返回搜索值的第一个字符的数字位置。 - 用于从列
SUBSTRING
中获取两组值;string_val
使用通过以下方式获得的数字位置LOCATE
:val1
将返回string_val
搜索到的值之前的值@val
(LOCATE
结果需要减1)。val2
将返回该string_val
匹配项的值@val
及其之后的任何内容。
- 在外部查询中,使用 .
chk1
检查提取到的最后一个字符val1
与字母表REGEXP
。在这种情况下GOBALL
,将返回 true (1
),9232BALL
而9232BALLV
将返回 false (0
)。在这里,我们将看看任何错误。 chk2
检查是否val2
匹配搜索到的@val
.9232BALL
因此,最终获得BALL
for的分离值val2
将返回 true (1
),而9232BALLV
最终获得BALLV
forval2
将返回 false (0
)。在这里,我们将看看什么是真的。- 最后一个过滤器正在检查添加的
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;
推荐阅读
- ios - TestFlight的兑换码可用于其他Apple ID
- amazon-web-services - 我可以使用 Okta 管理对 S3 存储桶的访问吗?
- apache-kafka - Windows - Kafka 启动服务器未启动
- angular - NativeScript - 如何让单元测试正常工作?
- sql - 如果我只想在第二个斜杠之后提取第二个,如何在大查询中使用 regex_extract?
- node.js - 两个日期之间的差异,包括JS中的第一天和最后一天
- c++ - 读取和写入片段着色器中的缓冲区
- c# - 如何使用标签助手从复选框输入中调用操作
- java - Gradle“评估根项目时出现问题。对于输入字符串:“=10”
- .net - 无法在数据库项目中运行单个文件生成器