我的任务是开发一个行为基本类似于下面的查询:
SELECT * FROM tblTestData WHERE *.TestConditions LIKE '*textToSearch*'
textToSearch 是一个字符串,其中包含有关测试给定设备的条件的信息(电压,电流,频率等),格式如下:
[V:127][PF:1][F:50][I:65]
目标是恢复在127伏电压下执行的任何和所有测试的列表,因此开发的SQL看起来像下面这样:
SELECT * FROM tblTestData WHERE *.TestConditions LIKE '*V:127*'
这是按预期工作但由于数据的不正确引入而存在问题,有些情况下_textToSearch字符串如下所示:
[V.127][PF:1][F:50][I:65]
[V.230][PF:1][F:50][I:65]
正如您所看到的,我以前的SQL事务不起作用,因为它不符合条件。
如果我尝试执行以下事务,目的是忽略不正确的数据格式:
SELECT * FROM tblTestData WHERE *.TestConditions LIKE '*V*127*'
交易不成功并返回错误。
这次交易我做错了什么不行?我接近这个问题了吗?
我看到了一对问题,但是如果有一组测试条件如下:
[V.127][PF:1][F:50][I:127]
[V.230][PF:1][F:50][I:127]
如果两者都符合上述交易的条件,它会返回两个点的值吗?
总之,我的问题是:
我希望很清楚我要求的是什么,如果不是,请指出不清楚的地方,我会尽力澄清它
答案 0 :(得分:3)
一种选择是在“V”和“127”之间寻找任何字符:
WHERE TestConditions LIKE '%V_127%'
请注意,%
是任意长度的字符串的通配符,_
是单个字符的通配符。
您还可以使用正则表达式:
WHERE regexp_like(TestConditions, 'V[.:]127')
请注意,正则表达式匹配字符串中的任何位置,因此不需要开头和结尾的通配符。
答案 1 :(得分:1)
您可以检查这两种情况(虽然这会降低性能)
SELECT *
FROM tblTestData
WHERE (TestConditions LIKE '%V:127%' OR TestConditions LIKE '%V.127%')
如果只有旧记录存在此问题,最好清理数据库中的数据。
答案 2 :(得分:1)
Oracle建议在这种情况下使用正则表达式。您可以为您的案例构建正则表达式:
WITH your_table AS (
SELECT '[V.127][PF:1][F:50][I:65]' text_to_search FROM dual
UNION
SELECT '[V.230][PF:1][F:50][I:65]' text_to_search FROM dual
UNION
SELECT '[V:127][PF:1][F:50][I:65]' text_to_search FROM dual
)
SELECT *
FROM your_table
WHERE REGEXP_LIKE(text_to_search,'\[V(.|:)127\]','i')
或者你可以使用好的旧LIKE
运算符。在这种情况下,您需要知道:
%
匹配零个或多个字符_
仅匹配一个字符因此,您应该使用下划线来匹配:
或.
WITH your_table AS (
SELECT '[V.127][PF:1][F:50][I:65]' text_to_search FROM dual
UNION
SELECT '[V.230][PF:1][F:50][I:65]' text_to_search FROM dual
UNION
SELECT '[V:127][PF:1][F:50][I:65]' text_to_search FROM dual
)
SELECT *
FROM your_table
WHERE text_to_search LIKE '%V_127%';