Запрос SQL для значений, состоящих только из определенного символа - PullRequest
0 голосов
/ 11 мая 2018

Как бы я запросить значения, которые состоят только из определенного символа, независимо от длины?

У меня есть таблица следующим образом:

CustID  MAC_Addr
001     AV4A46299992
002     99999
003     A8JEO943K8
004     999999999999
005     A99K0O37DG49
006     999
007     9

Я пытаюсь выяснить,запрос, который будет возвращать только CustID 002, 004, 006 и 007, потому что их MAC_Addr содержит только 9 - и ничего больше, независимо от длины;но хочу удостовериться, что я не втягиваю других, имеющих последовательные 9 (например, CustID 001).

Относительный новичок здесь, так что может быть что-то простое, о чем я не знаю, просто не очень повезло.Спасибо!

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Выберите CustID, MAC_Addr из имени таблицы, где MOD (MAC_Addr, 9) = 0;

РЕДАКТИРОВАТЬ:

Выберите CustID, MAC_Addr из имени_ таблицы, где REGEXP_LIKE (MAC_Addr,'^ [[: digit:]] + $') и MOD (MAC_Addr, 9) = 0;

EDIT: 2 Выберите CustID, MAC_Addr из имени_таблицы где REGEXP_LIKE (MAC_Addr, '^ [[: digit:]] + $ ') и MAC_Addr> 0 и MOD (MAC_Addr, 9) = 0;

0 голосов
/ 16 мая 2018

Еще один вариант Oracle:

SELECT *
  FROM t
  WHERE TRIM('9' FROM MAC_Addr) IS NOT NULL

Может потребоваться больше обрезки, если могут быть пробелы. Смотри https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions199.htm

0 голосов
/ 11 мая 2018

Следующее должно работать почти на любом диалекте SQL:

select t.*
from t
where replace(mac_addr, left(mac_addr, 1), '') = '';

EDIT:

Если вы заботитесь только о '9', вы можете использовать:

select t.*
from t
where replace(mac_addr, '9', '') = '';

РЕДАКТИРОВАТЬ II:

Хорошо, Oracle не поддерживает LEFT(), так же поступите с SUBSTR():

select t.*
from t
where replace(mac_addr, substr(mac_addr, 1, 1), '') = '';
...