Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Проверить формат varchar. my SQL

1287  1 2 3 4 все
melodi_ постоялец18.06.21 15:55
NEW 18.06.21 15:55 
Последний раз изменено 18.06.21 15:57 (melodi_)

Привет помогите пож. закончить функцию. (С. ниже)

Чем проверить Номер Рейса (Варчар)? Он может быть мин. 3 и мах. 8 знаков. Я уже это проверерила в Функции.


drop function if exists validate_flight_number;

DELIMITER $$

CREATE FUNCTION validate_flight_number (fln varchar(8))RETURNS int

BEGIN DECLARE result_c int;

IF char_length(fln) >= 3

and char_length(fln) <= 8

and ??????????

THEN SET result_c = 1;

ELSE set result_c = 0 ;

END IF;

RETURN result_c;

END$$

DELIMITER ;


Но не могу придумать как проверить следующие условия (вместо ?????????):


#1 
NightWatch коренной житель18.06.21 16:53
NightWatch
miltorg коренной житель18.06.21 16:59
miltorg
NEW 18.06.21 16:59 
в ответ melodi_ 18.06.21 15:55

а напишите по русски - я люблю регулярки

Половина евро в час
#3 
melodi_ постоялец21.06.21 11:24
NEW 21.06.21 11:24 
в ответ miltorg 18.06.21 16:59

Эта сволочь не работает как надо((((((((

{}

x{n} and x{m,n} This notation is used to match many instances of the x. In the case of x{n} the match must be exactly that many times. In the case of x{m,n}, the match can occur from m to n times. For example, to match zero or one instance of the string ari (which is identical to (ari)?), the following can be used:

SELECT 'Maria' REGEXP '(ari){0,1}';
+-----------------------------+
| 'Maria' REGEXP '(ari){0,1}' |
+-----------------------------+
|                           1 |
+-----------------------------+
#4 
MrSanders коренной житель21.06.21 11:38
NEW 21.06.21 11:38 
в ответ melodi_ 21.06.21 11:24

Почему вы так думаете? Вы выполнили SELECT 'Maria' REGEXP '(ari){0,1}'

Какой результат вы ожидали увидеть?

#5 
NightWatch коренной житель21.06.21 11:58
NightWatch
NEW 21.06.21 11:58 
в ответ MrSanders 21.06.21 11:38

Вероятно, 0, так как "Maria" - явно не номер рейса. улыб

#6 
MrSanders коренной житель21.06.21 14:00
NEW 21.06.21 14:00 
в ответ NightWatch 21.06.21 11:58

Нинадатарапицца! До номера рейса нам ещё идти и идти. Пока что мы ищем ari в Maria.

#7 
melodi_ постоялец21.06.21 14:23
NEW 21.06.21 14:23 
в ответ MrSanders 21.06.21 14:00

Почему вы так думаете? Вы выполнили SELECT 'Maria' REGEXP '(ari){0,1}'

Какой результат вы ожидали увидеть?

'Maria' это просто пример из сети. Но если применить только этот синтакс на номер рейса, то не работает:


fln regexp '[a-zA-Z0-9]{1}[a-zA-Z0-9]{1}[a-zA-Z]{0,1}[0-9]{1}[0-9]{0,1}[0-9]{0,1}[0-9]{0,1}[a-zA-Z]{0,1}'


ИЗ задания: xx(a)n(n)(n)(n)(a)

x : (a-zA-Z0-9) --> [a-zA-Z0-9]{1}

x: (a-zA-Z0-9) --> [a-zA-Z0-9]{1}

(a): (a-zA-Z)--> [a-zA-Z]{0,1}

n: (0-9)-->[0-9]{1}

(n):(0-9)-->[0-9]{0,1}

(n):(0-9)-->[0-9]{0,1}

(n):(0-9)-->[0-9]{0,1}

(a): (a-zA-Z)--> [a-zA-Z]{0,1}


Мне нужно что то найти, что б с интексом работало (как индекс в стринге/списке).

#8 
melodi_ постоялец21.06.21 14:26
NEW 21.06.21 14:26 
в ответ melodi_ 21.06.21 14:23

select '55?8777K' regexp '[a-zA-Z0-9]{1}[a-zA-Z0-9]{1}[a-zA-Z]{0,1}[0-9]{1}[0-9]{0,1}[0-9]{0,1}[0-9]{0,1}[a-zA-Z]{0,1}';

-->1((((((((((

#9 
melodi_ постоялец21.06.21 14:29
NEW 21.06.21 14:29 
в ответ MrSanders 21.06.21 11:38

Может все возможные комбинации в if then опросить?

#10 
NightWatch коренной житель21.06.21 14:30
NightWatch
NEW 21.06.21 14:30 
в ответ melodi_ 21.06.21 14:26

^

Match the beginning of a string

$

Match the end of a string.

https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp...

#11 
NightWatch коренной житель21.06.21 14:33
NightWatch
NEW 21.06.21 14:33 
в ответ melodi_ 21.06.21 14:23

[a-zA-Z0-9]{1}[a-zA-Z0-9]{1} = [a-zA-Z0-9]{2}

[a-zA-Z]{0,1} = [a-zA-Z]?

[0-9]{1}[0-9]{0,1}[0-9]{0,1}[0-9]{0,1} = [0-9]{1,4}

#12 
melodi_ постоялец21.06.21 14:46
NEW 21.06.21 14:46 
в ответ NightWatch 21.06.21 14:33

я думаю это не поможет. regexp видит мой стринг как салат и говорит есть ли в нем например огурцы или помидоры. Если там еще носки в салате ему все равно. А мне нужно чтоб он полку видел, где слева на право лежит огурец, огурец, помидор и т.д.

#13 
melodi_ постоялец21.06.21 14:51
NEW 21.06.21 14:51 
в ответ NightWatch 21.06.21 14:33

[a-zA-Z]{0,1} = [a-zA-Z]

к сожалению нет. Все что в скобках например (a), (n) может быть на этом месте в номере, а может и не быть. Поэтому {0,1} Минимально 0, максимально 1

#14 
NightWatch коренной житель21.06.21 14:52
NightWatch
NEW 21.06.21 14:52 
в ответ melodi_ 21.06.21 14:46

Это эквивалентные выражения. Просто чуть короче. Сути не меняет.

Решение твоей проблемы постом выше.

#15 
MrSanders коренной житель21.06.21 14:52
NEW 21.06.21 14:52 
в ответ melodi_ 21.06.21 14:23

'Maria' это просто пример из сети. Но если применить только этот синтакс на номер рейса, то не работает:


fln regexp '[a-zA-Z0-9]{1}[a-zA-Z0-9]{1}[a-zA-Z]{0,1}[0-9]{1}[0-9]{0,1}[0-9]{0,1}[0-9]{0,1}[a-zA-Z]{0,1}'

"Оно не работает" слишком старая шутка. Не смешно.

Что именно "не работает"? Не возвращает 1 для АА0 или не возвращает 0 для 123BBB? Пример данных дайте, с которыми у вас "не работает".

И исправьте выражение как вам выше предложили, сделайте покороче.

#16 
NightWatch коренной житель21.06.21 14:54
NightWatch
NEW 21.06.21 14:54 
в ответ melodi_ 21.06.21 14:51
to match zero or one instance оf the string ari (which is identical to (ari)?),

{0,1} = ?

#17 
MrSanders коренной житель21.06.21 14:56
NEW 21.06.21 14:56 
в ответ NightWatch 21.06.21 14:52
Решение твоей проблемы постом выше.

Слишком быстро. Так ТС ничего не поймёт, скопипастит все эти ^ и $ как мощное колдунство и будет лепить всюду, где что-то не работает :)

#18 
NightWatch коренной житель21.06.21 15:03
NightWatch
NEW 21.06.21 15:03 
в ответ MrSanders 21.06.21 14:56
Слишком быстро.

Посмотрим. Может, придется еще и на помидорах объяснять.

#19 
akidervish постоялец21.06.21 15:04
NEW 21.06.21 15:04 
в ответ melodi_ 21.06.21 14:46
А мне нужно чтоб он полку видел, где слева на право лежит огурец, огурец, помидор и т.д.

Try "substring":


https://www.w3schools.com/sql/func_mysql_substring.asp

#20 
1 2 3 4 все