Конденсация И предложение Oracle sql - PullRequest
0 голосов
/ 27 июня 2018

Я сталкивался с этим в одном из сценариев sql, которые есть у нас для одного из наших приложений. Я заметил, что он используется в других местах, но разве он не проверяет наличие предмета?

AND INSTR((SELECT (',' || REPLACE('OWN, JO', ' ', NULL) || ',') b FROM DUAL),
         (',' || aao.AcctRoleCd || ',')) > 0

Где он смотрит, если 'OWN' или 'JO' в aao.AcctRoleCd. Если это так, то INSTR приведет к тому, что его индекс в строке будет больше единицы. Таким образом, предложение AND будет true.

Разве это не плохо, чтобы проверить, существует ли такой предмет? Будет ли что-то еще из строки предложения IN лучше?

AND aao.AcctRoleCd IN ('OWN', 'JO');

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы правы, но спасибо, что поделились этим удивительно плохим кодом.

(SELECT (',' || REPLACE('OWN, JO', ' ', NULL) || ',') b FROM DUAL)

- совершенно ненужный скалярный подзапрос. Может быть заменено на

',' || REPLACE('OWN, JO', ' ', NULL) || ','

Однако, поскольку этот фрагмент имеет только литералы, его можно заменить следующим результатом:

,OWN,JO,

и да, может показаться, что весь INSTR может быть заменен предложенным вами кодом, если только aao.AcctRoleCd не может содержать 'N, J' или что-то подобное, в этом случае исходный код и ваш код получат разные результаты. Я серьезно сомневаюсь, что это проблема.

С уважением, Рагу

0 голосов
/ 27 июня 2018

Почти:

  • 'OWN, JO' - текстовый литерал.
  • REPLACE('OWN, JO', ' ', NULL) просто удаляет пробел из строки, давая 'OWN,JO'.
  • ',' || 'OWN,JO' || ',' просто объединяет запятые в начале и конце строки, давая ',OWN,JO,'.
  • (SELECT ',OWN,JO,') b FROM DUAL) является избыточным, и вы можете просто использовать предыдущий текстовый литерал.
  • INSTR( ',OWN,JO,', (',' || aao.AcctRoleCd || ',') ) > 0 ищет запятую в начале и конце подстроки, равную aao.AcctRoleCd, поэтому может соответствовать либо 'OWN', 'JO' или 'OWN,JO'.

Таким образом, вы можете заменить его на:

AND aao.AcctRoleCd IN ( 'OWN', 'JO', 'OWN,JO' )

Теперь, возможно, 'OWN,JO' не соответствует ожидаемому (или может даже не быть действительным значением), и вы можете удалить его из списка, но это то, что вам нужно будет определить.

...