Как я могу использовать несколько операторов case внутри одного псевдонима в операторе SELECT? - PullRequest
2 голосов
/ 04 июля 2019

Как я могу приписать несколько операторов CASE одному ALIAS?

Предполагая, что у меня есть следующие таблицы. Каждый столбец 'id' - это bigint, а все остальные поля - varchar (255). 'some_word' - это имя продукта, которое недавно было переименовано в другое имя, и мне нужно сгенерировать отчет, чтобы все вхождения 'some_word' использовались нашими менеджерами контента для замены старого имени новым именем.

tbl_course c
------------------------------------------------------
| id  | fullname    | shortname | summary            |
------------------------------------------------------
| 1   | some_word   | AB        | apples and bananas |
| 788 | Jays Course | JC        | xyz some_word      |
------------------------------------------------------

tbl_assign a
--------------------------------------------
| id | name            | intro             |
--------------------------------------------
| 1  | some_word No. 5 | Hello, some_word! |
| 9  | cats            | Not Dogs          |
--------------------------------------------

tbl_data_content dc
---------------------------------
| id | description | modulename |
---------------------------------
| 51 | my data     | some_word  | 
| 70 | some_word   | carrots    | 
---------------------------------

Мне необходимо создать один оператор SELECT, который возвращает все значения 'some_word' по всей базе данных следующим образом:

--------------------------------------------
| id  | Entity Name     | Entity Type      |
--------------------------------------------
| 1   | some_word       | tbl_course       |
| 788 | Jays Course     | tbl_course       |
| 1   | some_word No. 5 | tbl_assign       |
| 51  | my data         | tbl_data_content | 
| 70  | some_word       | tbl_data_content |
-------------------------------------------- 

Псевдоним «Имя сущности» должен содержать c.fullname, a.name и dc.modulename («имя» модуля, который нужно отредактировать).

Псевдоним «Тип сущности» должен содержать имя таблицы (tbl_course, tbl_assign и tbl_data_content).

Псевдоним 'Id' должен содержать c.id, a.id и dc.id.

Я предполагаю, что лучший метод - это использовать три ALIASES ('id', 'Entity Name' и 'Entity Type'), каждый из которых содержит несколько операторов CASE, которые ограничивают возвращаемые данные значением 'LIKE'% some_word% '. Однако мои попытки приписать несколько операторов CASE одному ALIAS потерпели неудачу.

Как я могу это сделать? Я буду запускать это на нескольких экземплярах этого приложения, которое нам нужно изменить, и каждый из этих экземпляров находится в базах данных MySQL, MariaDB или PostgreSQL, поэтому я хотел бы создать отчет, который можно легко импортировать и запускать в каждом экземпляре. ,

Ваша помощь очень ценится :)

Я пытался вложить операторы CASE друг в друга. Однако это предполагает, что любые значения в первом (верхнем) CASE возвращают TRUE, что может быть не так. Э.Г.

SELECT 
   CASE WHEN c.fullname LIKE '%some_word%'
      THEN c.fullname 
      CASE WHEN c.shortname LIKE '%some_word%'
         THEN c.fullname
      END
   END AS 'Entity Name'
   --repeat for each table
FROM tbl_course c, tbl_assign a, tbl_data_content dc

Ответы [ 3 ]

1 голос
/ 04 июля 2019

Я бы предложил использовать union all и нормализовать данные в подзапросе.Я думаю, что вы можете объединить значения для поиска,

select id, entityname, entitytype,
from ((select id, fullname as entityname, 'tbl_course' as entitytype
              concat(fullname, '|', shortname, '|', summary) as tosearch
       from tbl_course
      ) union all
      (select id, name as entityname, 'tbl_course' as entittype
              concat(name, '|', intro) as tosearch
       from tbl_assign
      ) union all
      (select id, description as entityname, 'tbl_data_content' as entittype
              concat(description, '|', modulename) as tosearch
       from tbl_data_content
      )
     ) x
where tosearch like <pattern here>
0 голосов
/ 04 июля 2019

ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ НЕСКОЛЬКО УСЛОВИЙ В ОДНОМ СЛУЧАЕ, КАК ЭТОТ

CASE WHEN [CONDITION] THEN [RESULT] 
     WHEN [CONDITION] THEN [RESULT] 
     WHEN ..... THEN [RESULT] 
     ELSE [DEFAULT] 
END
0 голосов
/ 04 июля 2019

Один запрос SELECT (как на самом деле только один SELECT) здесь, вероятно, невозможен.

Вы можете жестко закодировать каждое поле таблицы, которое может содержать some_word в запросе SELECT, и использовать UNION для объединения всего в одном наборе результатов.

SELECT [id]
     , [fullname] as [Entity Name]
     , 'tbl_course' as [Entity Type]
  FROM [tbl_course]
 WHERE [fullname] LIKE '%some_word%'

 UNION

SELECT [id]
     , [fullname]
     , 'tbl_course'
  FROM [tbl_course]
 WHERE [shortname] LIKE '%some_word%'

 UNION

SELECT [id]
     , [name]
     , 'tbl_assign'
  FROM [tbl_assign]
 WHERE [name] LIKE '%some_word%'

 UNION

SELECT [id]
     , [name]
     , 'tbl_assign'
  FROM [tbl_assign]
 WHERE [intro] LIKE '%some_word%'

 UNION

SELECT [id]
     , [description] 'tbl_data_content'
  FROM [tbl_data_content]
 WHERE [description] LIKE '%some_word%'

 UNION

SELECT [id]
     , [description] 'tbl_data_content'
  FROM [tbl_data_content]
 WHERE [modulename] LIKE '%some_word%';

Этот запрос (формально это один SQL-запрос) должен дать результаты в вашем вопросе. Однако я не проверял это.

Вам нужно будет самостоятельно добавить дополнительные запросы SELECT для других комбинаций таблиц / полей.

Если вы не хотите жестко кодировать его или вам нужна большая гибкость, вы можете создать сценарий SQL, который динамически создает / создает запрос, описанный выше. Но в этом случае вам все еще нужна таблица (или другой источник данных), которая содержит список всех полей в каждой таблице, которые могут содержать some_word.

Надеюсь, это поможет.

...