Использование Coalesce с несколькими объединениями

Вам нужно удалить часть, которая говорит data:image/png;base64, в начале данных изображения. После этого будут получены фактические данные base64.

Просто разделите все до и включите base64, (перед вызовом base64_decode() по данным), и все будет в порядке.

0
задан marc_s 13 July 2018 в 13:18
поделиться

4 ответа

Попробуйте выполнить запрос ниже. Это приведет к появлению нескольких записей для одного и того же имени «Джон» и «Боб», поскольку у вас есть несколько внутренних и внешних ролей для того же ИД (Id 3). Если это не то, что вы хотите, сообщите мне, какой из них вы хотите отобразить.

CREATE TABLE #Personnel
    (
        Name VARCHAR(100) ,
        InternalRoleID INT ,
        ExternalRoleID INT
    );

CREATE TABLE #InternalRoles
    (
        ID INT ,
        Name VARCHAR(100)
    );

CREATE TABLE #ExternalRoles
    (
        ID INT ,
        NAme VARCHAR(100)
    );

INSERT INTO #Personnel
VALUES ( 'John', 3, NULL ) ,
       ( 'Bob', NULL, 3 ) ,
       ( 'Rick', 5, NULL ) ,
       ( 'Anna', 6, NULL );


INSERT INTO #InternalRoles ( ID ,
                             Name )
VALUES ( 3, 'Accountant' ) ,
       ( 3, 'Manager' ) ,
       ( 5, 'Supervisor' ) ,
       ( 6, 'Worker' );



INSERT INTO #ExternalRoles ( ID ,
                             NAme )
VALUES ( 3, 'Delivery Driver' ) ,
       ( 3, 'Cleaner' ) ,
       ( 5, 'Electrician' ) ,
       ( 6, 'Auditor' );


SELECT P.Name ,
       COALESCE(IR.Name, ER.NAme) AS RoleName
FROM   #Personnel P
       LEFT JOIN #InternalRoles IR ON P.InternalRoleID = IR.ID
       LEFT JOIN #ExternalRoles ER ON P.ExternalRoleID = ER.ID;

DROP TABLE #ExternalRoles;
DROP TABLE #Personnel;
DROP TABLE #InternalRoles;
2
ответ дан AB_87 17 August 2018 в 13:41
поделиться
  • 1
    Спасибо, что работает. Очень признателен. – Matamako 13 July 2018 в 05:21
  • 2
    Не беспокойся. Вы все еще можете обновить свои данные образца и пометить ответ как принятый, чтобы он помог кому-то еще в будущем. – AB_87 13 July 2018 в 05:22

Попробуйте следующее: - с использованием Case

SELECT p.Name, CASE WHEN isnull(i.Name,'') = '' THEN e.Name ELSE i.Name END 
  FROM Personnel p LEFT JOIN InternalRoles i ON p.InternalRoleID = i.ID 
               LEFT JOIN ExternalRoles e ON p.ExternalRoleID = e.ID 
0
ответ дан CodeChimp 17 August 2018 в 13:41
поделиться

Есть несколько способов справиться с этим:

  • Используйте COALESCE для возврата первого значения не NULL ( SQL Fiddle )
    SELECT Personnel.Name, COALESCE(InternalRoles.Name, ExternalRoles.Name, 'Unknown') AS RoleName
    FROM Personnel
    LEFT OUTER JOIN InternalRoles ON InternalRoles.ID = Personnel.InternalRoleID AND Personnel.ExternalRoleID IS NULL
    LEFT OUTER JOIN ExternalRoles ON ExternalRoles.ID = Personnel.ExternalRoleID AND Personnel.InternalRoleID IS NULL
  • Используйте ISNULL для возврата второго значения, если заданное значение NULL ( SQL Fiddle )
    SELECT Personnel.Name, ISNULL(InternalRoles.Name, ExternalRoles.Name) AS RoleName
    FROM Personnel
    LEFT OUTER JOIN InternalRoles ON InternalRoles.ID = Personnel.InternalRoleID AND Personnel.ExternalRoleID IS NULL
    LEFT OUTER JOIN ExternalRoles ON ExternalRoles.ID = Personnel.ExternalRoleID AND Personnel.InternalRoleID IS NULL
  • Используйте CASE для определения поведения if-then-else ( SQL Fiddle )
    SELECT Personnel.Name, CASE WHEN Personnel.InternalRoleID IS NOT NULL THEN InternalRoles.Name ELSE ExternalRoles.Name END AS RoleName
    FROM Personnel
    LEFT OUTER JOIN InternalRoles ON InternalRoles.ID = Personnel.InternalRoleID AND Personnel.ExternalRoleID IS NULL
    LEFT OUTER JOIN ExternalRoles ON ExternalRoles.ID = Personnel.ExternalRoleID AND Personnel.InternalRoleID IS NULL

Реально, единственное, что вам нужно будет сделать, - это то, что лучше всего подходит стиль вашего запроса, так как все они имеют одинаковые планы выполнения и относительно одинаковое время выполнения. Лично я бы рекомендовал использовать COALESCE, так как он позволяет отображать значение по умолчанию, если одно из значений Name в ваших таблицах Internal / ExternalRoles оказывается NULL, если вы этого хотите.

0
ответ дан Hoppeduppeanut 17 August 2018 в 13:41
поделиться

В качестве альтернативы вы можете попробовать следующее:

select [Name],
       coalesce((select [Name] from InternalRoles where id = p.InternalRoleId),
                (select [Name] from ExternalRoles where id = p.ExternalRoleId)) [RoleNamE]
from Personnel p
0
ответ дан Michał Turczyn 17 August 2018 в 13:41
поделиться
  • 1
    Это вызывает ошибку при использовании образца данных с неидентичными идентификаторами в вопросе OP, поскольку он возвращает несколько значений (см. Этот SQL Fiddle ). – Hoppeduppeanut 13 July 2018 в 06:12
  • 2
    @Hoppeduppeanut Как вы правильно сказали, это ID и ID по умолчанию уникальны ... Вот почему я предложил такой запрос. Но в целом, если эти столбцы не были уникальными, это создавало бы ошибки - вы в этом уверены. – Michał Turczyn 13 July 2018 в 06:24
Другие вопросы по тегам:

Похожие вопросы: