2016-05-19 2 views
0

я была поставлена ​​задача разработать запрос, который ведет себя по существу как следующий:SQL Как условие не запускается

SELECT * FROM tblTestData WHERE *.TestConditions LIKE '*textToSearch*' 

textToSearch является строка, которая содержит информацию о состоянии, в котором данный устройство проверяется (напряжение, ток, частота и т.д.) в следующем формате в качестве примера:

[V:127][PF:1][F:50][I:65] 

цель состоит в том, чтобы восстановить список любых и все тесты, выполняемые при напряжении 127 вольт, так что SQL разработали бы как folllowing:

SELECT * FROM tblTestData WHERE *.TestConditions LIKE '*V:127*' 

Это работает как задумано, но есть проблема в связи с введением inproper данных, имеются случаи, в которых строка _textToSearch выглядит следующим примерам:

[V.127][PF:1][F:50][I:65] 
[V.230][PF:1][F:50][I:65] 

As вы можете видеть, моя предыдущая транзакция 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

Подстановочный знак для нескольких символов - '%' в SQL, а не '*': https://docs.oracle.com/database/121/SQLRF/conditions007.htm#SQLRF52142, но вы, вероятно, захотите использовать регулярное выражение : https://docs.oracle.com/database/121/SQLRF/conditions007.htm#SQLRF00501 –

ответ

3

Один из вариантов - поиск любой Характер между «V» и «127»:

WHERE TestConditions LIKE '%V_127%' 

Обратите внимание, что % является символом для строки любой длины и _ является символом для одного символа.

Вы также можете использовать регулярные выражения:

WHERE regexp_like(TestConditions, 'V[.:]127') 

Обратите внимание, что регулярные выражения совпадают в любом месте строки, поэтому групповые символы в начале и в конце не нужны.

+0

Большое спасибо, хотя другие ответы также работают, это то, что я искал, так как это очень читаемо –

1

Вы можете проверить в обоих случаях (хотя это будет снижать производительность)

SELECT * 
FROM tblTestData 
WHERE (TestConditions LIKE '%V:127%' OR TestConditions LIKE '%V.127%') 

Лучше очистить данные в вашей базе данных, если эта проблема возникла только у старых записей.

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%'; 
Смежные вопросы