Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x / 25 сообщений из 27, страница 1 из 2
23.04.2020, 12:56
    #39950410
МистерШоу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Почтенные коллеги!

Оракл умеет чудеса, виражи, CASE, DECODE...
Но из академического, если так можно выразиться, любопытства, уже вне контекста могучего диалекта Оракл.
Получить выражение, использующее только арифметические операции, которое возвращает 1, если переменная равна 0,
иначе саму переменную.
я выжал из себя только такое:

SELECT
(
((x-y)/(x+y))
*
((x+y)/(x-y))

) + x
FROM (select 0 as x, 9999999 as y) t

но одно из чисел табуируется :(

Наверняка есть что-то поизящнее? есть кто запросто управляется с теорией чисел и арифметикой?


Пресветлый старец Фалоим Московскый.
тимтэг:некоммерческое товарищество "Напиджак",
издательство "Московский Пустомолец"
...
Рейтинг: 0 / 0
23.04.2020, 13:00
    #39950414
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
МистерШоу,

"иначе саму переменную"

причем тут у?

.....
stax
...
Рейтинг: 0 / 0
23.04.2020, 13:07
    #39950421
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
МистерШоу

я выжал из себя только такое:

Я бы спросил, чем это отличается от банального "x+1" :)
X (((X-Y)/(X+Y))*((X+Y)/(X-Y)))+ X+1-4 -3 -3-3 -2 -2-2 -1 -1-1 -1E-40 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5
...
Рейтинг: 0 / 0
23.04.2020, 13:09
    #39950423
МистерШоу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Stax, о, если вы избавитесь от этого Y, вы будете моим кумиром, и буду славить вас где только можно!

ну он нужен чтобы превентить деление на 0, если на вход пришел именно 0...
...
Рейтинг: 0 / 0
23.04.2020, 13:11
    #39950426
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
МистерШоу
Stax, о, если вы избавитесь от этого Y, вы будете моим кумиром, и буду славить вас где только можно!

ну он нужен чтобы превентить деление на 0, если на вход пришел именно 0...

((x-y)/(x+y))*((x+y)/(x-y)) тождественно равно единице для x <> y и не определено для x = y
Ошибка 10 -40 связана с точностью машинных вычислений.
...
Рейтинг: 0 / 0
23.04.2020, 13:19
    #39950434
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
МистерШоу
выражение, использующее только арифметические операции

Вот тут вопрос - какие именно операции Вы готовы назвать "арифметическими".
Вообще Вам сюда: https://ru.wikipedia.org/wiki/Функция_Хевисайда
...
Рейтинг: 0 / 0
23.04.2020, 13:23
    #39950438
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> SELECT x
  2  , x+ power(0d,power(0d,x+1))-power(0d,power(0d,x))
  3  , x+1-abs(sign(x))
  4  FROM (select rownum-5 as x from dual connect by level < 10) t
  5  ;
         X X+POWER(0D,POWER(0D,X+1))-POWE X+1-ABS(SIGN(X))
---------- ------------------------------ ----------------
        -4                             -4               -4
        -3                             -3               -3
        -2                             -2               -2
        -1                             -1               -1
         0                              1                1
         1                              1                1
         2                              2                2
         3                              3                3
         4                              4                4
9 rows selected

SQL> 
...
Рейтинг: 0 / 0
23.04.2020, 13:26
    #39950442
МистерШоу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
andrey_anonymous, ну моё выражение для X вернет все же X, а не X + 1

четыре базовые арифметические: +, -, *, /
...
Рейтинг: 0 / 0
23.04.2020, 13:29
    #39950445
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
МистерШоу
andrey_anonymous, ну моё выражение для X вернет все же X, а не X + 1

Заблуждаетесь. Я посчитал специально для Вас.
МистерШоу
четыре базовые арифметические: +, -, *, /

Операции возведения в степень через них пишите сами.
А операции взятия модуля и операции со знаками на одной арифметике - тем более.
...
Рейтинг: 0 / 0
23.04.2020, 13:37
    #39950453
МистерШоу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
andrey_anonymous,
Код: plsql
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.
SELECT
	x
	,
	(
	((x-y)/(x+y))
	*
	((x+y)/(x-y))

	) + x as f
FROM
(
	SELECT
	 0 as x
	UNION ALL
	SELECT
	 1 as x
	UNION ALL
	SELECT
	 2 as x
	UNION ALL
	SELECT
	 3 as x
	UNION ALL
	SELECT
	 -1 as x
	UNION ALL
	SELECT
	 -2 as x
	UNION ALL
	SELECT
	 -3 as x

) t1 JOIN (SELECT 10 as y) as t2 ON 1 = 1


вывод:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
x           f
----------- -----------
0           1
1           1
2           2
3           3
-1          -1
-2          -2
-3          -3



Модератор: пожалуйста, форматируйте свои сообщения.
...
Рейтинг: 0 / 0
23.04.2020, 13:40
    #39950457
МистерШоу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
хотя, конечно, несу ерунду...
...
Рейтинг: 0 / 0
23.04.2020, 13:45
    #39950463
МистерШоу
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
чушь я написал...сам вижу. тайпкастинг обманул. намудрил я знатно :)
Х = х +1 :)
...
Рейтинг: 0 / 0
23.04.2020, 14:05
    #39950476
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Для избегания zero_divide - nullif или *1d.
...
Рейтинг: 0 / 0
23.04.2020, 14:07
    #39950479
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
-2-
Для избегания zero_divide - nullif или *1d.

Не оракель у него... Да и nullif - не арифметика ни разу :)
...
Рейтинг: 0 / 0
23.04.2020, 20:19
    #39950697
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
МистерШоу,

Можно задачу свести к получению целой части числа.
Которую получить можно либо встроенными средствами bitand/trunc/etc либо возведением в степень до опупения.

Но может выстрелить если не хватит точности для возведения в квадрат плюс один (см. последнюю строку).
Код: plsql
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.
SQL> with t(x) as
  2  (
  3  select -3 + level from dual connect by level <= 5
  4  union all
  5  select 0.1 from dual
  6  union all
  7  select 0.000001 from dual
  8  union all
  9  select 0.000000000000000000001 from dual
 10  )
 11  select x - (x - 1) * bitand(1 / (x * x + 1), 1) r1,
 12         x - (x - 1) * trunc(1 / (x * x + 1)) r2,
 13         x - (x - 1) * power(1 / (x * x + 1), 1e125) r3,
 14         x
 15    from t;

        R1         R2         R3          X
---------- ---------- ---------- ----------
        -2         -2         -2         -2
        -1         -1         -1         -1
         1          1          1          0
         1          1          1          1
         2          2          2          2
        .1         .1         .1         .1
   .000001    .000001    .000001    .000001
         1          1          1 1.0000E-21

8 rows selected.
...
Рейтинг: 0 / 0
23.04.2020, 20:51
    #39950704
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Главное, чтобы эту тему не приняли всерьёз современные кодеры.
Иначе такое начнётся!!! :-(

Впрочем, будет тогда у нас больше простой оплачиваемой работы по оптимизации их кода! :-)

* * *

Я недавно примерно такое видел:
Код: plsql
1.
2.
3.
4.
5.
6.
-- Вариант (1)
...
WHERE 1 = CASE WHEN a = 10 AND b IN (1,5,7,9) THEN 1 
               ELSE 0
          END
...

Как оно вам?

Вот такое обычное разве не лучше?
Код: plsql
1.
2.
3.
4.
5.
-- Вариант (2)
...
WHERE a = 10
  AND b IN (1,5,7,9)
...


Или Вариант (1) делает какой-то автоматический генератор команд?
...
Рейтинг: 0 / 0
23.04.2020, 21:26
    #39950714
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
SQL*Plus,

В случае внешнего соединения на 10g была бы принципиальная разница выраженная в
Код: plsql
1.
ORA-01719: outer join operator (+) not allowed in operand of OR or IN
...
Рейтинг: 0 / 0
23.04.2020, 23:04
    #39950746
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
SQL*Plus

Я недавно примерно такое видел:
Код: plsql
1.
2.
3.
4.
5.
6.
-- Вариант (1)
...
WHERE 1 = CASE WHEN a = 10 AND b IN (1,5,7,9) THEN 1 
               ELSE 0
          END
...

Как оно вам?

Вот такое обычное разве не лучше?
Код: plsql
1.
2.
3.
4.
5.
-- Вариант (2)
...
WHERE a = 10
  AND b IN (1,5,7,9)
...


зависит от... Например, если нужен битмап индекс, то на первое выражение можно его построить
...
Рейтинг: 0 / 0
24.04.2020, 10:09
    #39950836
Misha111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
МистерШоу

четыре базовые арифметические: +, -, *, /

как вариант
Код: plsql
1.
2.
3.
SELECT x, 
x*(x-1)/(x+1e-100)+1 a
FROM (select rownum-5 as x from dual connect by level < 10) t
...
Рейтинг: 0 / 0
24.04.2020, 10:16
    #39950839
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Misha111,

ERROR at line 2:
ORA-01476: divisor is equal to zero

....
stax
...
Рейтинг: 0 / 0
24.04.2020, 13:09
    #39950942
Misha111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Stax,
у меня с x+0d вместо x+1e-100 не работает
проверил на
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected to Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0
Код: sql
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.
SQL> SELECT x,
  2  x*(x-1)/(x+1e-100)+1 a
  3  FROM (select rownum-5 as x, 0d y from dual connect by level < 10) t
  4  ;
 
         X          A
---------- ----------
        -4         -4
        -3         -3
        -2         -2
        -1         -1
         0          1
         1          1
         2          2
         3          3
         4          4
 
9 rows selected
 
Executed in 0,031 seconds
 
SQL> 
SQL> SELECT x,
  2  x*(x-1)/(x+0d)+1 a
  3  FROM (select rownum-5 as x, 0d y from dual connect by level < 10) t
  4  ;
 
SELECT x,
x*(x-1)/(x+0d)+1 a
FROM (select rownum-5 as x, 0d y from dual connect by level < 10) t
 
ORA-01722: invalid number
...
Рейтинг: 0 / 0
24.04.2020, 13:50
    #39950979
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Misha111,

я о ограничении x <> -1e-100

мож для МистерШоу и не важно

ps
попробовал с 1d, получил NaN/Inf и бросил
....
stax
...
Рейтинг: 0 / 0
05.05.2020, 14:23
    #39954323
Nicolese
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Если разрешить пользоваться степенями, то можно вот так:
x+power(0,x)
...
Рейтинг: 0 / 0
05.05.2020, 16:21
    #39954346
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
Nicolese
Если разрешить пользоваться степенями, то можно вот так:
x+power(0,x)


А кто сказал x > 0 ?

SY.
...
Рейтинг: 0 / 0
05.05.2020, 16:32
    #39954349
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
SY,

ну не сложно же допилить до x+power(0,x*x)

Regards

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


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