2017-01-13 2 views
-1

Это может быть простой вопрос для экспертов., используя декодирование с занесенным запятой.

Вот мое требование. Я должен использовать DECODE и соответствовать строке, содержащей значения, разделенные запятой.

Ниже приведен пример SQL-: 'A' это значение столбца из таблицы, 'A,B'C' имеет разделенные запятой строка передается в качестве выражения SQL

SELECT DECODE('A' , 'A,B,C', 'true', 'false') FROM DUAL; 

выше SQL должен возвращать верно, как выражение CSV содержит 'A'.

Пожалуйста, помогите мне писать этот SQL

+1

Почему вы «должны» использовать DECODE для этого? (Вам действительно нужно?) Также - есть ли входы и значения таблицы все отдельные буквы? Или вы также можете сравнить «A» со строкой «A, BC, X, YS»? Если это последнее, обратите внимание на любое решение, основанное только на 'instr' или regexp. Буква L будет найдена во входных данных «ABC, KLM, XY», что, вероятно, не то, что вы хотите. – mathguy

ответ

0

Если я понимаю ваш вопрос, вы пытаетесь определить, находится ли строка в другой строке?

select case when instr('A,B,C', 'A') > 0 
     then 'True' 
     else 'False' 
     end 
from dual 

Добавьте DECODE версию

select decode(instr('A,B,C', 'A'), 0, 'False', 'True') 
    from dual 
+0

Спасибо, но можем ли мы использовать DECODE? Это потому, что DECODE использует в существующем sql, который ранее получил только одно значение. Но теперь значение разделено запятой string –

+0

Спасибо BobC. Оцените, если вы предоставили мне SQL с именем «A» (значение столбца) и выражение (значение, разделенное запятой), как второе в инструкции DECODE. Вот как мой весь SQL построен и я не хочу сильно меняться –

+0

В этом примере приведен неправильный результат 'code SELECT DECODE (INSTR ('BA, C, D', 'A'), 0, 'False', ' True ') FROM DUAL code' –

1

Во-первых, не используйте decode(). Используйте инструкцию ANSI CASE. Ответ на ваш вопрос, что вы можете использовать LIKE:

SELECT (CASE WHEN ',' || 'A,B,C' || ',' LIKE '%,' || 'A' || ',%'   
      THEN 'true' ELSE 'false' 
     END) 
FROM DUAL; 

Примечание: конкатенация только потому, что я подозреваю, что значения переменных. Простая форма:

SELECT (CASE WHEN ',A,B,C,' LIKE '%,A,%'   
      THEN 'true' ELSE 'false' 
     END) 
FROM DUAL; 
0

Использование расшифровку, вы можете сделать это следующим образом:

SELECT DECODE(INSTR('A,B,C', 'A'), 0, 'false', 'true') FROM DUAL; 

где INSTR('Comma separated string', 'column value to match') возвращает 0, если значение столбца не запятой разделенная строка. В вашем примере INSTR('A,B,C', 'A') вернет значение, превышающее 0, и INSTR('D,B,C', 'A') вернет 0. Таким образом, DECODE может проверить, является ли возвращаемое значение INSTR() равным 0, а затем возвращает false, иначе верните true.

+0

Большое спасибо. Однако моя строка, разделенная запятыми, всегда будет отображаться как выражение, например. SELECT DECODE ('A', 'A, B, C', 'true', 'false') FROM DUAL –

+0

В этом примере приведен неправильный результат 'code' SELECT DECODE (INSTR ('BA, C, D', 'A'), 0, 'False', 'True') FROM DUAL 'code –

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