Здесь может помочь узел String Manipulation с regexMatcher
, хотя результатом будет String (со значениями True
/ False
по умолчанию), поэтому потребуется дополнительный узел, если для Например, требуется число (если другая строка, вы можете использовать троичный оператор ?
/ :
, например == "True" ? "when true" : join("when false it was because '", $columnReference$, "' was not found")
).
Вы можете использовать regexMatcher
следующим образом ( \Q
/ \E
помогает избежать обработки содержимого столбца Reference
как регулярного выражения (кроме случаев, когда оно содержит \E
)) :
regexMatcher($text$, join(".*?\\Q", $Reference$, "\\E.*+")) == "True" ? "vrai" : "faux"
Это определенно похоже на ошибку в коде слияния представления оптимизатора Oracle. Я держал пари, что Вы только получаете это с представлениями, которые содержат внешние объединения. Ваш ORDER BY
решает его, потому что это практически вызывает a NO_MERGE
на представлении.
Я не поместил бы ни одного ORDER BY
или a NO_MERGE
подскажите в представлении, хотя, потому что (в зависимости от Вашего объема данных) оно могло ухудшить производительность других запросов, которые используют представление. Необходимо поместить подсказку no_merge во внешний запрос:
Select /*+ NO_MERGE(foo) */ *
From foo
where
1 <> 1
Необходимо также повысить SR с поддержкой Oracle, поскольку это - определенно ошибка. Тот запрос никогда не должен возвращать строки независимо от того, что Вы выбираете из, или насколько сложный это внутри. Никогда.
Я не мог воспроизвести его, таким образом, это, вероятно, фиксируется в версии, я использую. Какова версия дб, которую Вы используете?
Частичное решение
Обновите Представление путем добавления order by 1
после where
пункт.
WHERE clbuttic.asset_type = bar.asset_type
AND bar.field16 = yadda.field9(+)
AND bar.field1 = snafu.field1(+)
AND (bar.field17 IS NULL)
order by 1;
Это лечит симптом (и я не должен перекомпилировать и повторно развернуть код), но не говорит мне, почему я получаю это странное поведение.
Обновление: Выполнение порядка на строковой константе имеет то же влияние, но не изменяется, план (как показано объясняют план). Я подозревает, что будет выполняться быстрее, что порядок 1 (то, которое я думаю, должно отсортировать по первому столбцу).
WHERE clbuttic.asset_type = bar.asset_type
AND bar.field16 = yadda.field9(+)
AND bar.field1 = snafu.field1(+)
AND (bar.field17 IS NULL)
order by "a";
Связанный с мыслями Cody Casterline: возможно, полон столбец 1 в представлении Нулевых значений? Если Oracle интерпретирует, ГДЕ как "значение в столбце 1, не равном для оценки в столбце 1" и значении в столбце 1, является НУЛЕВЫМ, мы входим, странный мир SQL АННУЛИРУЕТ. Это имеет место на каждом диалекте SQL, я знаю, что NULL=NULL не верен. Возможно, Oracle решила, что ПУСТОЙ УКАЗАТЕЛЬ <> ПУСТОЙ УКАЗАТЕЛЬ поэтому должен быть верным?
SELECT
вероятно, не повреждается. Во-первых, получите точную строку запроса, это вызывает это поведение. Выполните запрос непосредственно на DB, не через приложение VB 6. Проблема все еще происходит? Пойдите оттуда.
Было бы очень интересно видеть план выполнения относительно запроса, с помощью...
explain plan for select ...;
select * from table(dbms_xplan.display);
При запросах представления затем, это могло бы показать, как предикат оценивается в неправильной фазе
Возможно, если Вы хотели просто протестировать соединение с базой данных.
Вы обычно использовали бы что-то как этот, когда Вы хотите только возвратить весь из столбцы для таблицы SQL. Если это не работает в Oracle, можно хотеть попробовать что-то так же неправильно как:
Select *
From foo
where
1 == 2
или возможно
where
key < 0
WHERE 1 = 1
должен вызвать полное сканирование таблицы, так же, как исключение WHERE
пункт полностью. При получении каждой строки от таблицы конечно, это - полное сканирование таблицы.
Я не могу прокомментировать о WHERE 1 <> 1
отказ работать как ожидалось над Oracle. Это звучит действительно неправильным. Вы уверены, что видели результат, который Вы описываете от того запроса? Попробуйте его снова, чтобы быть уверенными.
Одно место я видел используемый или даже использовал его сам, как быстрый способ скопировать структуру таблицы, не копируя содержание:
create table foo2
as select * from foo where 1 <> 1;
(за исключением того, что я всегда использую! =, а не <> - который я действительно не был должен (см. комментарий счета)),
Если у Вас есть случай, где можно ясно продемонстрировать, что Oracle возвращает строки в SQL Плюс то, когда Вы выполняете "выбор * от my_view, где 1 <> 1" затем необходимо связаться с поддержкой Oracle (или заставить уполномоченное лицо в компании делать так): это указало бы на значительную ошибку. Конечно, если Вы будете использовать старую версию Oracle, то они, вероятно, просто скажут Вам обновлять!
Это собирается звучать странным, но представление/таблица имеет столбец названным "1"?
Походит на ошибку в объединяющем представление коде в Oracle. Oracle возьмет Ваш оператор Where и объединит его в представление SQL и затем придумает план относительно этого.
Попробуйте свой выбор с помощью этой подсказки и посмотрите, уходит ли проблема:
SELECT /*+ NO_MERGE */ ...
Вы могли также посмотреть на ОБЪЯСНИТЬ ПЛАН получить некоторое понимание, что идет не так, как надо.
Когда Вы хотите динамично генерировать a WHERE
пункт. Таким образом, Вы могли просто добавить некоторых OR [another-condition]
пункты и заставляют его работать, не проверяя, является ли условие первым или нет.
Oracle не делает этого для меня:
SQL*Plus: Release 10.2.0.1.0 - Production on Thu Mar 19 13:36:20 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> select * from wrkr where 1 <> 1;
no rows selected
SQL> select count(*) from wrkr;
COUNT(*)
----------
88
Править: Это - ничего внутреннего с представлениями, также:
SQL> create view foo as select * from wrkr;
View created.
SQL> select count(*) from foo;
COUNT(*)
----------
88
SQL> select * from foo where 1 <> 1;
no rows selected
Хорошо... то, почему это произошло бы в Oracle, вне меня. Однако я могу сказать Вам, почему это часто используется в другом DBS: когда человек хочет возвращенные столбцы, но никакие значения. (Такой что касается создания схемы для новой таблицы)
Просто мозговая атака здесь, и может быть абсолютно неправильной, но я хочу сказать, что я видел, что некоторый синтаксический анализ синтаксических анализаторов SQL закрыл кавычки целые числа как значение "столбца X". Можно подтвердить это путем попытки:
ВЫБЕРИТЕ 1 ИЗ нечто ГДЕ 1 <> 1
Если 1 полно значений из первого столбца Вашей таблицы, Вы, вероятно, хотите придерживаться заключенных в кавычки целых чисел:
ВЫБЕРИТЕ * ИЗ НЕЧТО ГДЕ '1' <> '1'
Но, снова, я мог быть абсолютно неправым здесь. Я не сделал, чтобы Oracle установила удобный для испытания его на.:p