2017-01-27 3 views
0

Есть ли способ, чтобы выбрать только те поля, которые соответствуют следующим критериям из определенного столбца в MySQL:Выберите только значение Length & Формат - MySQL

Максимальная длина = 9 Первые 3 символа должны быть HSA Последние 6 символов должен быть только INT . 6 цифр должны начинаться с 0 ... Это может измениться позже, чтобы начать с 1/2 и т. д.

В приведенной ниже таблице показаны основные схемы и возможные значения полей.

row | visit_date | field_value 
----+------------+--------------- 
1 |2016-12-07 |HSA023456 
2 |2016-12-08 |HSA059870 
3 |2016-12-06 |225981450  
4 |2016-12-05 |HSAB02354  
5 |2016-12-13 |HSA0234567 
6 |2016-12-14 |HSA  
7 |2016-12-14 |HSA0987  
8 |2016-12-16 |1234HSA00 

Строки 1 - 3 являются допустимыми строками и должны быть возвращены.

Строки 4 - 8 являются недопустимыми строками и должны быть игонированными.

Я попытался ниже, хотя это не дает правильный результат, как это только обеспечить частичное решение:

,  CASE 
      WHEN CHAR_LENGTH(NFB.field_value) > 8 AND NFB.field_value LIKE 'HSA%' THEN UPPER(NFB.field_value) 
      WHEN CHAR_LENGTH(NFB.field_value) < 9 AND NFB.field_value LIKE 'HSA%' THEN CONCAT(UPPER(NFB.field_value),'VALIDATE') 

ELSE "" END FIELD_VALUE

Благодарности

+0

Пожалуйста, добавьте некоторые схемы SQL, некоторые фиктивные данные, что вы уже пробовали и некоторые результаты образца ваших желаемые вывод. –

+1

Да, попробуй это для себя. И, возможно, взгляните на темное искусство регулярных выражений. – Strawberry

+0

Первые 4 являются «HSA0», правильно? – Strawberry

ответ

2

Этот запрос является хорошим кандидатом на использование оператора регулярных выражений MySQL REGEXP. Обратите внимание, что все ваши требования могут быть удовлетворены путем сопоставления со следующим регулярным выражением:

^HSA0[0-9][0-9][0-9][0-9][0-9]$ 

Это соответствует 9 символов в точности, которые начинаются с HSA0, а затем остальные пять цифр.

SELECT * 
FROM yourTable 
WHERE field_value REGEXP '^HSA0[0-9][0-9][0-9][0-9][0-9]$' 

Update:

Если вы хотите ограничить только прописные буквы, то вы можете добавить LIKE условия проверки для этого:

SELECT * 
FROM yourTable 
WHERE field_value REGEXP '^HSA0[0-9][0-9][0-9][0-9][0-9]$' AND 
     field_value LIKE BINARY 'HSA%' 

REGEXP чувствителен к регистру, поэтому обходной путь необходимо.

+0

Блестящий, спасибо ... Есть ли REGXP, а затем только HSA, как верхний регистр? Извините, это одна часть, которую я упустил из моего первоначального вопроса, но, глядя на набор результатов, я понял, что мне нужно также исключить hsa для нижнего регистра, чтобы обеспечить лучшее качество данных. –

+0

Чему стоит миллион, оцените его. Рассматривая решение, выполняет ли оператор BINARY точное совпадение с подобным полем? i.e, если бы мне пришлось в будущем сказать LIKE BINARY 'Hsa%', здесь будут применяться прописные и строчные чеки?(Это всего лишь гипотетический сценарий для моего обучения) –

+0

Да, использование 'BINARY' с' LIKE' приведет к сравнению случая. В этом случае вам нужны все кепки. –

1

вы можете выбрать строки, где ваш Condtion является истинным

select my_col 
    from my_table 
    where left(my_col, 3) = 'HSA' 
    AND right(my_col,6) REGEXP '^-?[0-9]+$' 
    AND left(right(my_col,6),1) ='0'; 

или

select my_col 
    from my_table 
    where left(my_col, 3) = 'HSA0' 
    AND right(my_col,6) REGEXP '^-?[0-9]+$' 
+0

Спасибо: -) ... Этот ответ также очень помогает здесь, а также очень действительное решение –

Смежные вопросы