Выберите столбец, если пусто, выберите из другого

Как определить, является ли поле пустым (не пустым), а затем выбрать другое поле, если оно пустое?

Что мне действительно нужно, так это функция IsBlank, которая работает так же, как IsNull, но с пробелами.

REPLACE не работает с пробелами, COALESCE работает только с NULL.


person graham.reeds    schedule 17.11.2009    source источник


Ответы (4)


Как насчет объединения COALESCE и NULLIF.

SELECT COALESCE(NULLIF(SomeColumn,''), ReplacementColumn)
FROM SomeTable
person PHeiberg    schedule 17.11.2009
comment
Интересно... можно ли его легко расширить для работы с 3 столбцами? - person graham.reeds; 17.11.2009
comment
Ответ - да можно: COALESCE(NULLIF(Address2,''), NULLIF(Address3,''), Address4) - person graham.reeds; 17.11.2009
comment
Перемещение ответа на ваш, поскольку оно более элегантно, чем оператор Case. - person graham.reeds; 17.11.2009
comment
Нереально, как мне это помогло. - person Angesehen; 21.08.2019

Вы можете использовать оператор CASE для этого

select 
Case WHEN Column1 = '' OR Column1 IS NULL OR LEN (TRIM (Column1))  = 0 
     THEN Column2 
     ELSE Column1 END as ColumnName
from TableName
person Raj More    schedule 17.11.2009
comment
Это то, что я получил сам, но очень неуклюже. - person graham.reeds; 17.11.2009
comment
Я пробовал это, но каким-то образом добавлял повторяющиеся строки. - person Ryan Bradley; 31.10.2019

РЕДАКТИРОВАТЬ: вы не можете использовать IF() в mssql.

Используйте оператор IF в части SELECT вашего SQL:

SELECT IF(field1 != '', field1, field2) AS myfield FROM ...
person MDCore    schedule 17.11.2009
comment
Хорошо, но если мне нужно работать более чем с двумя столбцами, это будет больно. - person graham.reeds; 17.11.2009
comment
Кажется, я не могу заставить это работать: SELECT IF(Address2!='', Address2, Address3) AS Address FROM Sites дает неверный синтаксис рядом с ключевым словом «ЕСЛИ». - person graham.reeds; 17.11.2009
comment
Ладно, я полный тупица и путаюсь с mysql. IF() работает только с mysql, поэтому лучше используйте CASE WHEN THEN ELSE END, как указано выше. Оставлю это здесь в качестве предупреждения для других :) - person MDCore; 17.11.2009

Вы всегда можете написать функцию isBlank(), что-то вроде

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION isBlank
(
    @CheckExpression varchar, @ReplacementExpression varchar
)
RETURNS varchar
AS
BEGIN
    IF @CheckExpression IS NOT NULL
    BEGIN
        IF @CheckExpression='' or LEN(@CheckExpression) = 0
        RETURN @ReplacementExpression
    ELSE
        RETURN @CheckExpression
    END

    RETURN @ReplacementExpression
END
GO
person Chris Welsh    schedule 17.11.2009
comment
Я предполагаю, что вы могли бы заставить его поддерживать количество выражений N, поскольку COALESCE все равно делает это с помощью оператора case, такого как Raj More. - person graham.reeds; 17.11.2009