Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / isnumeric / 10 сообщений из 10, страница 1 из 1
16.11.2011, 16:14
    #37529600
ARTURV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
Добрый день уважаемые коллеги

Во всех СУБД, с которыми работал, была функция isnumeric для проверки - является ли текст числом.
В PostgreSQL не нашел. Может быть здесь надо делать проверку по другому
...
Рейтинг: 0 / 0
16.11.2011, 16:26
    #37529652
SmeL_md
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
Код: plaintext
1.
2.
CREATE FUNCTION isnumeric(text) RETURNS boolean AS '
SELECT $1 ~ ''^[0-9]+$''
' LANGUAGE 'sql';
...
Рейтинг: 0 / 0
16.11.2011, 16:41
    #37529683
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
ARTURV,

на заметку - пг !очень строго типизированный
...
Рейтинг: 0 / 0
16.11.2011, 17:24
    #37529795
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
SmeL_md
Код: plaintext
1.
2.
CREATE FUNCTION isnumeric(text) RETURNS boolean AS '
SELECT $1 ~ ''^[0-9]+$''
' LANGUAGE 'sql';

Код: plaintext
1.
2.
SELECT '1E10' ~ '^[0-9]+$';
--
f

-думаю, можно написать ф-ю на основе обработки исключений каста. т.е. считать что всё, на что (на текущий момент в текущей бд) авто-преобразование типа текст в numeric не даёт ошибки - то и есть [с т.з. этой бд] - numeric.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
PREPARE foo(text) AS 
(SELECT $ 1 ::numeric);

EXECUTE foo('1.123E-10');
--
 0 . 0000000001123 
EXECUTE foo('s1.123E10');
--
ERROR:  invalid input syntax for type numeric: "s1.123E10"

********** Ошибка **********

ERROR: invalid input syntax for type numeric: "s1.123E10"
SQL state: 22P02
...
Рейтинг: 0 / 0
16.11.2011, 20:32
    #37530218
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
qwwq-думаю, можно написать ф-ю на основе обработки исключений каста. т.е. считать что всё, на что (на текущий момент в текущей бд) авто-преобразование типа текст в numeric не даёт ошибки - то и есть [с т.з. этой бд] - numeric.Только вот цена ловли ошибки в plpgsql функции очень большая.
...
Рейтинг: 0 / 0
16.11.2011, 21:52
    #37530331
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
ребята, ну какого, простите, в базу за место цифры текст вставлять, а?
...
Рейтинг: 0 / 0
16.11.2011, 21:54
    #37530333
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
описывается "интерфейс", например можно хранимку. она типизированная, текст за место нумирика не примет и всё.

если дело в "хитрой" логике уже внутри. то тогда, регулярка на "цифры", да
...
Рейтинг: 0 / 0
17.11.2011, 11:29
    #37531022
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
Warstoneqwwq-думаю, можно написать ф-ю на основе обработки исключений каста. т.е. считать что всё, на что (на текущий момент в текущей бд) авто-преобразование типа текст в numeric не даёт ошибки - то и есть [с т.з. этой бд] - numeric.Только вот цена ловли ошибки в plpgsql функции очень большая.
что есть, то есть

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
CREATE FUNCTION isnumeric_0(text) RETURNS boolean AS $$
SELECT $ 1  ~ '^[0-9]+$'
$$
 immutable LANGUAGE 'sql';
--
CREATE FUNCTION isnumeric_1(IN _input anyelement) RETURNS boolean AS $$
BEGIN 
	PERFORM _input::numeric;
	RETURN TRUE;
EXCEPTION
	WHEN OTHERS THEN
	RETURN FALSE;
END;
$$
 immutable LANGUAGE 'plpgsql';
--
CREATE TABLE test_t
(
  id serial,  
  textv text,
  numv numeric,
  CONSTRAINT test_t_pk primary key (id)
)
WITH (
  OIDS=FALSE
);
insert INTO  test_t(textv,numv) 
SELECT  CASE WHEN (random()>= 0 . 5 ) THEN 'v' ELSE '' END ||  s::text 
, s::numeric FROM generate_series( 1 , 10000 ) s
--
EXPLAIN ANALYZE
SELECT 
textv
,numv
FROM test_t
--
"Seq Scan on test_t  (cost=0.00..159.00 rows=10000 width=12) (actual time=0.020..11.764 rows=10000 loops=1)"
"Total runtime: 20.993 ms"
--
EXPLAIN ANALYZE
SELECT 
CASE WHEN isnumeric_0(textv) THEN textv::numeric ELSE NULL END AS numeric_
,textv
,CASE WHEN isnumeric_0(numv::text) THEN numv::numeric ELSE NULL END AS numv_
--ERROR:  function isnumeric_0(numeric) does not exist
,numv
FROM test_t
--
"Seq Scan on test_t  (cost=0.00..309.00 rows=10000 width=12) (actual time=0.041..35.616 rows=10000 loops=1)"
"Total runtime: 43.280 ms"
--не совсем бесплатно 
--
EXPLAIN ANALYZE
SELECT 
CASE WHEN isnumeric_1(textv) THEN textv::numeric ELSE NULL END AS numeric_
,textv
,CASE WHEN isnumeric_1(numv) THEN numv::numeric ELSE NULL END AS numv_
,numv
FROM test_t
--
"Seq Scan on test_t  (cost=0.00..5209.00 rows=10000 width=12) (actual time=0.275..381.080 rows=10000 loops=1)"
"Total runtime: 388.215 ms"
-- порядок
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
18.02.2020, 19:16
    #39928160
Шамиль Фаридович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
qwwq,
Так какой способ лучше?
Почему в комментариях вы пишите "Порядок" напротив isnumeric_1, хотя она работает мделеннее?
...
Рейтинг: 0 / 0
19.02.2020, 07:56
    #39928260
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnumeric
Шамиль Фаридович
qwwq,
Так какой способ лучше?
Почему в комментариях вы пишите "Порядок" напротив isnumeric_1, хотя она работает мделеннее?
ну не два же порядка . и не три.

хотя если вы о двоичных порядках...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / isnumeric / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]