Пока вы имеете дело с простыми символами ASCII, и вы счастливы использовать встроенные функции, это будет работать:
function reverse(s){
return s.split("").reverse().join("");
}
Если вам нужно решение, поддерживающее UTF- 16 или других многобайтовых символов, имейте в виду, что эта функция приведет к недопустимым строкам Unicode или действительным строкам, которые выглядят забавно. Возможно, вы захотите рассмотреть этот ответ .
Вы должны преобразовать предложения IN в предложения INNER JOIN.
Вы можете преобразовать запрос, подобный этому
SELECT foo
FROM bar
WHERE bar.stuff IN
(SELECT stuff FROM asdf)
в запросе, подобном этому другому.
SELECT b.foo
FROM (
SELECT DISTINCT stuff
FROM asdf ) a
JOIN bar b
ON b.stuff = a.stuff
Вы также получите большую производительность
Другой способ:
SELECT COL1, COL2, COL3 FROM YOUR_TABLE
WHERE 1=1
AND COL2 IN (
SELECT VAL1 as FAKE FROM DUAL
UNION
SELECT VAL2 as FAKE FROM DUAL
UNION
SELECT VAL3 as FAKE FROM DUAL
--...
)
UNION ALL
вместо конструктора UNION
и VALUES
вместо обоих.
– Hogan
5 October 2016 в 16:39
Для этого есть другое обходное решение, которое не упоминается ни в одном из других ответов (или на других ответах на вопросы):
Любой оператор, такой как x in (1,2,3)
, может быть переписан как (1,x) in ((1,1), (1,2), (1,3))
, а 1000 элементный лимит больше не будет применяться. Я протестировал с индексом на x
и объяснил, что план по-прежнему сообщает, что Oracle использует предикат доступа и сканирование диапазона.
Мы можем иметь более одного оператора «IN» для одной и той же переменной.
Для ex:
select val
from table
where val in (1,2,3,...)
or
val in (7,8,9,....)