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

Оракл умеет чудеса, виражи, 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
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950414
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МистерШоу,

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

причем тут у?

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

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

Я бы спросил, чем это отличается от банального "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
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950423
Фотография МистерШоу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax, о, если вы избавитесь от этого Y, вы будете моим кумиром, и буду славить вас где только можно!

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

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

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

Вот тут вопрос - какие именно операции Вы готовы назвать "арифметическими".
Вообще Вам сюда: https://ru.wikipedia.org/wiki/Функция_Хевисайда
...
Рейтинг: 0 / 0
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950438
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950442
Фотография МистерШоу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous, ну моё выражение для X вернет все же X, а не X + 1

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

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

Операции возведения в степень через них пишите сами.
А операции взятия модуля и операции со знаками на одной арифметике - тем более.
...
Рейтинг: 0 / 0
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950453
Фотография МистерШоу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950457
Фотография МистерШоу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя, конечно, несу ерунду...
...
Рейтинг: 0 / 0
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950463
Фотография МистерШоу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чушь я написал...сам вижу. тайпкастинг обманул. намудрил я знатно :)
Х = х +1 :)
...
Рейтинг: 0 / 0
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950476
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для избегания zero_divide - nullif или *1d.
...
Рейтинг: 0 / 0
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950479
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
Для избегания zero_divide - nullif или *1d.

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

Можно задачу свести к получению целой части числа.
Которую получить можно либо встроенными средствами 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
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950704
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)
...


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

В случае внешнего соединения на 10g была бы принципиальная разница выраженная в
Код: plsql
1.
ORA-01719: outer join operator (+) not allowed in operand of OR or IN
...
Рейтинг: 0 / 0
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950746
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950836
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МистерШоу

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

как вариант
Код: 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
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950839
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha111,

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

....
stax
...
Рейтинг: 0 / 0
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950942
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
выражение (только арифметические операции) которое возвращает 1, если x=0, иначе x
    #39950979
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha111,

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

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

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


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

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

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

Regards

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


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