Вытягивание двух отдельных запросов на основе предложения WHERE - PullRequest
1 голос
/ 29 апреля 2020

У меня есть таблица, из которой мне нужно получить указанную c информацию из массива. Возьмите примеры ниже:

List1:

[Agent1, Agent2, Agent3, Agent4, Agent5]

Table1:
Agent_Name| Test_ID | Agent_Score
  Agent1  |  0001   |    95
  Agent2  |  0002   |    93
  Agent2  |  0003   |    85
  Agent3  |  0004   |    99
  Agent4  |  0005   |    100
  Agent5  |  0006   |    88

Я хочу знать, есть ли способ получить эту информацию условно - если Agent_Name существует в списке выше, извлекать только записи этого агента. Если их имени не существует, вытащите каждую запись. Я дошел до первой части с помощью session_user ():

SELECT * FROM Table1 WHERE session_user() IN (Agent_Name)

Как установить условие перед оператором SELECT? Что-то вроде:

CASE WHEN session_user() IN (Agent_Name) THEN (SELECT * FROM Table1 WHERE session_user() IN (Agent_Name)) ELSE (SELECT * FROM Table1)

Это в Google SQL.

1 Ответ

2 голосов
/ 29 апреля 2020

Ниже приведен пример для BigQuery Standard Sql

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Agent1' Agent_Name, '0001' Test_ID, 95 Agent_Score UNION ALL
  SELECT 'Agent2', '0002', 93 UNION ALL
  SELECT 'Agent2', '0003', 85 UNION ALL
  SELECT 'Agent3', '0004', 99 UNION ALL
  SELECT 'Agent4', '0005', 100 UNION ALL
  SELECT 'Agent5', '0006', 88 
), list AS (
  SELECT Agent
  FROM UNNEST(['Agent1', 'Agent2']) Agent
)
SELECT * FROM `project.dataset.table` WHERE Agent_Name IN (SELECT Agent FROM list)
UNION ALL
SELECT * FROM `project.dataset.table` WHERE NOT EXISTS (
  SELECT 1 FROM `project.dataset.table` t
  JOIN list l ON l.Agent = t.Agent_Name
)   

Выше может быть изменен рефакторинг на чуть менее подробную версию

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Agent1' Agent_Name, '0001' Test_ID, 95 Agent_Score UNION ALL
  SELECT 'Agent2', '0002', 93 UNION ALL
  SELECT 'Agent2', '0003', 85 UNION ALL
  SELECT 'Agent3', '0004', 99 UNION ALL
  SELECT 'Agent4', '0005', 100 UNION ALL
  SELECT 'Agent5', '0006', 88 
), list AS (
  SELECT Agent
  FROM UNNEST(['Agent1', 'Agent2']) Agent
)
SELECT * FROM `project.dataset.table` 
WHERE Agent_Name IN (SELECT Agent FROM list)
OR NOT EXISTS (
  SELECT 1 FROM `project.dataset.table` t
  JOIN list l ON l.Agent = t.Agent_Name
)   

Идея состоит в том, чтобы использовать SESSION_USER () или CURRENT_USER (), чтобы проверить имя_агента пользователя, а затем вернуть ...

Итак, наконец

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Agent1' Agent_Name, '0001' Test_ID, 95 Agent_Score UNION ALL
  SELECT 'Agent2', '0002', 93 UNION ALL
  SELECT 'Agent2', '0003', 85 UNION ALL
  SELECT 'Agent3', '0004', 99 UNION ALL
  SELECT 'Agent4', '0005', 100 UNION ALL
  SELECT 'Agent5', '0006', 88 
)
SELECT *, SESSION_USER() FROM `project.dataset.table` 
WHERE Agent_Name = SESSION_USER() 
OR NOT EXISTS (
  SELECT 1 FROM `project.dataset.table` t
  WHERE Agent_Name = SESSION_USER()
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...