2013-05-07 6 views
1

В настоящее время я пытаюсь найти способ пропустить любые результаты поиска, где поле пусто. Простым методом было бы использовать <cfif len(example) neq 0>#example#</cfif>, но это значит, что мой запрос выводит результаты без необходимости.Опуская пустые/нулевые записи из запроса? (Coldfusion)

<cfquery datasource="#datasource#" name="search"> 
    <cfif URL.for eq "names"> 
     Select artist_id, artist_name 
     From artists 
     Where approved = 1 
     And active = 1 
     <cfif StructKeyExists("URL.search")> 
      <cfif URL.find eq "contains"> 
       And name LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%"> 
      <cfelseif URL.find eq "matches"> 
       And name = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#"> 
      </cfif> 
     </cfif> 
     Order By name Asc 

    <cfelseif URL.for eq "locations"> 
     <cfif URL.sort eq "town-az" or URL.sort eq "town-za"> 
      Select Distinct town 
     <cfelseif URL.sort eq "county-az" or URL.sort eq "county-za"> 
      Select Distinct county 
     <cfelseif URL.sort eq "country-az" or URL.sort eq "country-za"> 
      Select Distinct country 
     </cfif> 
     From artists 
     Where approved = 1 
     And active = 1 
     <cfif StructKeyExists("URL.search")> 
      <cfif URL.find eq "contains"> 
       <cfif URL.sort eq "town-az"> 
        And town LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%"> 
        Order By town Asc 
       <cfelseif URL.sort eq "town-za"> 
        And town LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%"> 
        Order By town Desc 
       <cfelseif URL.sort eq "county-az"> 
        And county IS NOT NULL 
        And county LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%"> 
        Order By county Asc 
       <cfelseif URL.sort eq "county-za"> 
        And county IS NOT NULL 
        And county LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%"> 
        Order By county Desc 
       <cfelseif URL.sort eq "country-az"> 
        And country LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%"> 
        Order By country Asc 
       <cfelseif URL.sort eq "country-za"> 
        And country LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%"> 
        Order By country Desc 
       </cfif> 

      <cfelseif URL.find eq "matches"> 
       <cfif URL.sort eq "town-az"> 
        And town = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#"> 
        Order By town Asc 
       <cfelseif URL.sort eq "town-za"> 
        And town = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#"> 
        Order By town Desc 
       <cfelseif URL.sort eq "county-az"> 
        And county IS NOT NULL 
        And county = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#"> 
        Order By county Asc 
       <cfelseif URL.sort eq "county-za"> 
        And county IS NOT NULL 
        And county = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#"> 
        Order By county Desc 
       <cfelseif URL.sort eq "country-az"> 
        And country = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#"> 
        Order By country Asc 
       <cfelseif URL.sort eq "country-za"> 
        And country = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.search#"> 
        Order By country Desc 
       </cfif> 
      </cfif> 
     </cfif> 
    </cfif> 
</cfquery> 

В town и country поля являются обязательными для заполнения при подписании, так что эти поля не являются проблемой, однако я не сделал округ/штат поле обязательное поле, поэтому значения будут NULL, если пользователь не введите графство или состояние. Как указано выше, я мог бы просто использовать метод len() только для отображения результатов с символами, но это означает, что мой запрос вытягивает результаты NULL, которые ему не нужно вытаскивать. Я уже включил AND county IS NOT NULL, но это не имеет никакого значения. Кто-нибудь сможет указать мне в правильном направлении? Благодарю.

+1

Вы можете показать образец результата? Являются ли поля введенными как NULL или пустые значения в базу данных? Если они NULL, то 'IS NOT NULL' является правильным синтаксисом. –

+0

Вы уверены, что они ноль, а не просто дефолт по умолчанию? –

+0

Введено как NULL, у меня оно есть, если поле остается пустым, когда они подписываются, оно не вводит никаких данных вообще, и также установило его, когда оно обновляет его, если поле остается пустым, оно просто обновляет значение до NULL. – Banny

ответ

1

В конце концов, это была пустая ошибка, однако стоит обратить внимание на всех, кто находит подобную проблему, если добавить дополнительные утверждения на основе существующих переменных, проверьте, что они не требуются на всех уровнях запроса.

SELECT DISTINCT county 
FROM artists 
WHERE active = 1 
AND approved = 1 
<cfif URL.sort eq "county-az" or URL.sort eq "county-za"> 
    AND county IS NOT NULL 
</cfif> 

выше, что мне нужно изменить в ядре запроса, обратите внимание, я включил раздел, чтобы исключить все NULL результаты ПЕРЕД проверки, если термин для поиска присутствует.

0

Попробуйте использовать динамический подход, использующий @variables в SQL Server:

declare @county varchar(50), @countylike varchar(50) 

Добавить некоторую логику, чтобы установить переменные, если они существуют в ColdFusion здесь:

<cfif ....> 

</cfif> 

Затем добавить что-то вроде этого к где пункт:

and (@county is null or county = @county) 
and (@countylike is null or county like '%'+ @countylike +'%') 
+0

Технически [сервер sql не гарантирует порядок оценки] (http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-оценен). Поэтому использование 'cfif' более безопасно. – Leigh

+0

с использованием кода, который я вставил, не зависит от порядка, если переменная округа равна нулю, тогда эта часть всегда оценивает значение true, аналогично переменной countylike. Вы все равно должны установить их, и я сделаю это в холодном слиянии, убедившись, что только один или другой был установлен. Обязательно используйте , чтобы попытаться предотвратить проблемы с инъекциями. – lpeckazca

Смежные вопросы