#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