SQL Like条件无法运行

时间:2016-05-19 09:00:57

标签: sql oracle

我的任务是开发一个行为基本类似于下面的查询:

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]

如果两者都符合上述交易的条件,它会返回两个点的值吗?

总之,我的问题是:

  1. LIKE' * V * 127 *'有什么问题?它没有工作的条件?
  2. 这种情况有什么影响?如果我不小心,它可以返回比预期更多的信息吗?
  3. 我希望很清楚我要求的是什么,如果不是,请指出不清楚的地方,我会尽力澄清它

3 个答案:

答案 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%';