Как использовать предложение between в nvarchar?

#sql #sql-server #sql-server-2012

#sql #sql-сервер #sql-server-2012

Вопрос:

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

    where Vendor_Value_Table.Feature_ID in (17,19) and value_text like 'Dhol Wala$Shahnai Wala' and value_text between 0 and 100`
 

потому что это относится к одному vendor_id
, но проблема в том, что тип данных столбца Value_Text равен nvarchar(max)
как это сделать, пожалуйста, предложите.

Комментарии:

1. Что такое DB? Ваша единственная проблема заключается в использовании between с nvarchar?

2. @AmirZiarati Nop это единственная проблема, поскольку вы можете видеть, что с одним и тем же идентификатором поставщика существует несколько значений, и я хочу запустить запрос с feature_id и value_text, например, так ВЫБЕРИТЕ * из Vendor_Value_Table, где Vendor_Value_Table . Feature_ID в (17,19) и value_text типа ‘Dhol Wala $ Shahnai Wala’ и value_text между 0 и 100, и это выдает ошибку, она должна возвращать одну строку, потому что это условие истинно

3. Что это значит? Между 0 и 100? У вас не может быть текста типа ‘dhol wala …..’ и от 0 до 100 одновременно.

4. @AmirZiarati есть две строки, одна из которых имеет значение от 0 до 100, а другая — значение Dhol Wala $ Shahnai Wala, и, как вы можете видеть, оба они верны для одного поставщика

5. Итак, почему вы использовали AND ? И означает одновременное использование обеих этих функций. Вы должны использовать или. Я отвечу через минуту 😉

Ответ №1:

Предполагая, что у вас не будет ОТРИЦАТЕЛЬНОГО ЧИСЛА, вы должны преобразовать nvarchar в Int для вашего предложения between и установить значение по умолчанию для случая, когда оно не может быть приведено, как показано ниже:

  SELECT *
  From Vendor_Value_Table
WHERE (Vendor_Value_Table.Feature_ID in (17,19)) 
AND(
value_text like 'Dhol Wala$Shahnai Wala' 
OR 
 (SELECT CASE WHEN ISNUMERIC(value_text) = 1 THEN CAST(value_text AS INT) ELSE -1 END) between 0 and 100
 )
 

Мы выбрали -1 по умолчанию, потому что, если его невозможно использовать для нумерации, предложение between всегда должно быть false.

(ОН БУДЕТ ОТВЕЧАТЬ ТОЛЬКО ДЛЯ ЧИСЕЛ, МЕНЬШИХ ДИАПАЗОНА INT)

Комментарии:

1. value_text (ВЫБЕРИТЕ СЛУЧАЙ, КОГДА ISNUMERIC(value_text)

2. могу ли я использовать это без оператора IN, например: ВЫБЕРИТЕ * из Vendor_Value_Table, ГДЕ Vendor_Value_Table . Feature_ID =17 И value_text, такие как ‘Dhol Wala $ Shahnai Wala’ И Vendor_Value_Table. Feature_ID =19 И value_text между 0 и 100, поскольку я знаю, что Feature_ID 17 предоставляет текст, а Feature_ID 19 предоставляет int

3. Да, но (17 и тому подобное) ИЛИ (19 и между ними). НЕ ИСПОЛЬЗУЙТЕ AND ДЛЯ ВСЕХ ИЗ НИХ. я думаю, вам нужно лучше разобраться в OR amp; И

4. На самом деле есть два условия, которые должны быть объединены в первую очередь, это endor_Value_Table . Feature_ID =17 И value_text типа ‘Dhol Wala $Shahnai Wala’

5. и второе — Vendor_Value_Table . Feature_ID =19 И value_text от 0 до 100