Как проверить, существует ли значение в столбце таблицы? - PullRequest
0 голосов
/ 14 марта 2019

Ниже приведен сценарий и структура таблицы:

enter image description here

Для данного токена может быть назначено 3 значения

  • Наличные
  • Чек
  • Черновик

Я пробовал запрос, который может принести мне Token_Id записей, для которых нет значения Черновик в Field_Value столбец.Из приведенного выше изображения мне нужно значение 1.Так как это единственные записи, которые не имеют draft значений.

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

select * from cash_memo where field_value not in ('Cash')

Пожалуйста, руководство.

Ответы [ 5 ]

1 голос
/ 14 марта 2019

Простой NOT EXISTS должен сделать это:

SELECT * -- or DISTINCT token_id
FROM cash_memo
WHERE field_value <> 'draft'
AND NOT EXISTS (
    SELECT 1
    FROM cash_memo AS x
    WHERE token_id = cash_memo.token_id
    AND field_value = 'draft'
)
1 голос
/ 14 марта 2019

Это может быть способ:

select token_id
from yourTable
group by token_id
having count (case when field_value = 'Draft' then 1 end) = 0 

Здесь я считаю строки с field_value = 'Draft' и получаю только token_id, для которого это число дает 0.

0 голосов
/ 14 марта 2019

Настройка Oracle :

CREATE TABLE cash_memo ( token_id, field_value ) AS
SELECT 1, 'Cash'   FROM DUAL UNION ALL
SELECT 2, 'Draft'  FROM DUAL UNION ALL
SELECT 2, 'Cheque' FROM DUAL UNION ALL
SELECT 3, 'Cash'   FROM DUAL UNION ALL
SELECT 3, 'Draft'  FROM DUAL UNION ALL
SELECT 3, 'Cheque' FROM DUAL UNION ALL
SELECT 4, 'Draft'  FROM DUAL UNION ALL
SELECT 4, 'Cheque' FROM DUAL UNION ALL
SELECT 5, 'Cash'   FROM DUAL UNION ALL
SELECT 5, 'Cheque' FROM DUAL;

Запрос 1 : если вы хотите, чтобы все столбцы для строк, для которых нет значения 'Draft', token_id, то вы можете использовать аналитическую функцию:

SELECT token_id,
       field_value
FROM   (
  SELECT token_id,
         field_value,
         COUNT( CASE field_value WHEN 'Draft' THEN 1 END ) OVER ( PARTITION BY token_id )
           AS numDraft
  FROM   cash_memo c
)
WHERE numDraft = 0;

Вывод :

TOKEN_ID | FIELD_VALUE
-------: | :----------
       1 | Cash       
       5 | Cash       
       5 | Cheque     

Запрос 2 : Если вы просто хотитесписок token_id, которые не имеют 'Draft' значений:

SELECT token_id
FROM   cash_memo
GROUP BY token_id
HAVING ( COUNT( CASE field_value WHEN 'Draft' THEN 1 END ) = 0 );

Выход :

| TOKEN_ID |
| -------: |
|        1 |
|        5 |

db <> Fiddle здесь

0 голосов
/ 14 марта 2019

вы можете использовать not in

select c.* from cash_memo c
    where  token_id not in (  select token_id 
                             from cash_memo 
                             where field_value = 'Draft')
0 голосов
/ 14 марта 2019

Это просто, используя FIND_IN_SET , вы можете попробовать это

SELECT token_id FROM yourTable WHERE FIND_IN_SET('{Draft}', field_value )

Здесь введите ключ {}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...