1=1 не работает с запросами Oracle DB или только через CF?

Я пытаюсь создать запрос, который работает с базой данных Oracle, к которой у нашей группы есть доступ для чтения, который извлекает результаты для вставки и изменения в локальной копии, находящейся под нашим контролем. У меня есть свой запрос, но я столкнулся с небольшой проблемой. Чтобы вернуть результаты моего запроса, я не могу использовать BETWEEN из-за того, как индексируется БД; использование диапазонов дат приводит к тому, что он работает слишком медленно, и PK не увеличивается последовательно. Вместо этого мне нужно перебрать массив значений и сопоставить их с PK.

Обычно для чего-то подобного против SQL-сервера я бы бросил на него что-то вроде этого:

AND ( 
    1=1
    <cfloop array="#orderHeaderNumArray#" index="i">
        OR TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
    </cfloop>
)

Однако каждый раз, когда я пробовал 1 = 1 для запроса Oracle, я всегда получаю ошибку UTF-8. В прошлом я только что наполовину решил решение, установив известное несуществующее значение в качестве условного, но мне было интересно, является ли # 1 это ограничением Oracle или CF и # 2, если было лучше решение в соответствии с всегда истинным, а не всегда ложным условным выражением.

Изменить: сервер CF10, но я не знаю, какую версию Oracle мы используем.


person K_Cruz    schedule 20.09.2013    source источник
comment
Это не связано с вашей проблемой, но когда я делаю что-то вроде того, что вы пытаетесь сделать, я использую 1 = 2.   -  person Dan Bracuk    schedule 20.09.2013
comment
ваш запрос всегда будет возвращать каждую строку, соответствующую вашему предложению WHERE. Опер ничего не даст в этом случае.   -  person Matt Busche    schedule 20.09.2013
comment
@Dan Я мог бы это использовать, но, насколько я понимаю, всегда true выполняется быстрее, чем всегда false, поэтому я предпочитаю это.   -  person K_Cruz    schedule 20.09.2013
comment
@ Мэтт, я не понимаю, что ты имеешь в виду. Несколько условий в SQL-запросе не работают без соответствующих операторов.   -  person K_Cruz    schedule 20.09.2013
comment
О, хорошо, тогда я просто изменю свой запрос, чтобы он содержал десять тысяч условных выражений, чтобы я получал точное совпадение для каждой записи, которую я ожидаю вернуть.   -  person K_Cruz    schedule 20.09.2013
comment
@KRC 1 = 1 означает, что он всегда будет возвращать true, поэтому 1=1 or header like 'head%' всегда будет возвращать все строки, потому что 1 всегда равно 1, часть or вашего условного выражения не имеет значения, поскольку это утверждение всегда будет возвращать true   -  person Matt Busche    schedule 20.09.2013


Ответы (2)


AND ( 
  1=1
  <cfloop array="#orderHeaderNumArray#" index="i">
     OR TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
  </cfloop>
  )

Не работает в Oracle или ColdFusion. Рассмотреть возможность

AND ( 
  1=0
  <cfloop array="#orderHeaderNumArray#" index="i">
     OR TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
  </cfloop>
  )

Если вас действительно беспокоит производительность 1=0

AND ( 
  <cfloop array="#orderHeaderNumArray#" index="i">
     <cfif i NEQ orderHeaderNumArray[1]> OR </cfif> TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
  </cfloop>
  )
person James A Mohler    schedule 20.09.2013
comment
+1 за ваш последний вариант. Я ненавижу видеть 1=1 в запросах (или 1=0). Просто мне кажется ленивым. - person Miguel-F; 20.09.2013
comment
Я предпочитаю 1=0 выполнению условной логики внутри цикла. - person Dan Bracuk; 20.09.2013

Я согласен с тем, что использование 1 = 1 далеко не идеально, но я думаю, что это приемлемо, если вы включаете комментарий о том, почему это там.

Но, что касается вопроса, вы пытались вместо этого назначить первичный ключ самому себе? то есть

AND ( 
    id = id
    <cfloop array="#orderHeaderNumArray#" index="i">
        OR TABLENAME.S_HEADER_NUMBER LIKE '#i#%' 
    </cfloop>
)
person Phil LaNasa    schedule 21.09.2013