То, как сравнить значения, которые могут оба быть нулевыми, является T-SQL

С O(1) dequeue(), что совпадает с ответом pythonquick :

// time: O(n), space: O(n)
enqueue(x):
    if stack.isEmpty():
        stack.push(x)
        return
    temp = stack.pop()
    enqueue(x)
    stack.push(temp)

// time: O(1)
x dequeue():
    return stack.pop()

С O(1) enqueue() (это не упоминается в этом посте, так что ответ), который также использует возврат, чтобы всплыть и вернуть самый нижний элемент.

// O(1)
enqueue(x):
    stack.push(x)

// time: O(n), space: O(n)
x dequeue():
    temp = stack.pop()
    if stack.isEmpty():
        x = temp
    else:
        x = dequeue()
        stack.push(temp)
    return x

Очевидно, это хорошее упражнение по кодированию, так как оно неэффективно, но, тем не менее, элегантно.

68
задан Quassnoi 2 July 2009 в 17:00
поделиться

7 ответов

Используйте оператор INTERSECT .

Это NULL -чувствительный и эффективный, если у вас есть составной индекс для всех ваших полей:

IF      EXISTS
        (
        SELECT  MY_FIELD1, MY_FIELD2, MY_FIELD3, MY_FIELD4, MY_FIELD5, MY_FIELD6
        FROM    MY_TABLE
        INTERSECT
        SELECT  @IN_MY_FIELD1, @IN_MY_FIELD2, @IN_MY_FIELD3, @IN_MY_FIELD4, @IN_MY_FIELD5, @IN_MY_FIELD6
        )
BEGIN
        goto on_duplicate
END

Примечание что если вы создадите индекс UNIQUE для своих полей, ваша жизнь станет намного проще.

48
ответ дан 24 November 2019 в 14:01
поделиться
-2
ответ дан 24 November 2019 в 14:01
поделиться

Вам нужно будет использовать IS NULL или ISNULL. Вокруг этого действительно нет никого.

0
ответ дан 24 November 2019 в 14:01
поделиться

Вы создаете первичный ключ для своих полей и позволяете механизму обеспечивать уникальность. Выполнение логики IF EXISTS в любом случае неверно, так как не соответствует условиям гонки.

6
ответ дан 24 November 2019 в 14:01
поделиться

Вы можете объединить каждое значение, но это немного раздражает:

    IF EXISTS(SELECT * FROM MY_TABLE WHERE 
    coalesce(MY_FIELD1,'MF1') = coalesce(@IN_MY_FIELD1,'MF1')  AND
    ...
    BEGIN
            goto on_duplicate
    END

Вам также необходимо убедиться, что значение объединенное не является допустимым в противном случае. в рассматриваемом столбце. Например, если бы было возможно, что значение MY_FIELD1 могло быть «MF1», это вызвало бы множество ложных совпадений.

10
ответ дан 24 November 2019 в 14:01
поделиться
IF EXISTS(SELECT * FROM MY_TABLE WHERE 
            (MY_FIELD1 = @IN_MY_FIELD1 
                     or (MY_FIELD1 IS NULL and @IN_MY_FIELD1 is NULL))  AND
            (MY_FIELD2 = @IN_MY_FIELD2 
                     or (MY_FIELD2 IS NULL and @IN_MY_FIELD2 is NULL))  AND
            (MY_FIELD3 = @IN_MY_FIELD3 
                     or (MY_FIELD3 IS NULL and @IN_MY_FIELD3 is NULL))  AND
            (MY_FIELD4 = @IN_MY_FIELD4 
                     or (MY_FIELD4 IS NULL and @IN_MY_FIELD4 is NULL))  AND
            (MY_FIELD5 = @IN_MY_FIELD5 
                     or (MY_FIELD5 IS NULL and @IN_MY_FIELD5 is NULL))  AND
            (MY_FIELD6 = @IN_MY_FIELD6
                     or (MY_FIELD6 IS NULL and @IN_MY_FIELD6 is NULL)))
            BEGIN
                    goto on_duplicate
            END

Многословный По сравнению с решением IFNULL / COALESCE. Но будет работать, не задумываясь о том, какое значение не будет отображаться в данных, которые можно использовать в качестве замены NULL.

20
ответ дан 24 November 2019 в 14:01
поделиться

Используйте ISNULL ]:

ISNULL(MY_FIELD1, 'NULL') = ISNULL(@IN_MY_FIELD1, 'NULL')

Вы можете изменить 'NULL' на что-то вроде 'All Values' , если это имеет больше смысла.

Следует отметить, что с двумя аргументами ISNULL работает так же, как COALESCE , который можно использовать, если у вас есть несколько значений для проверки (например, - COALESCE (@ IN_MY_FIELD1, @OtherVal, 'NULL') ). COALESCE также возвращается после первого ненулевого значения, что означает (незначительно) быстрее, если вы ожидаете, что MY_FIELD1 будет пустым. Однако я считаю ISNULL гораздо более читаемым, поэтому я и использовал его здесь.

32
ответ дан 24 November 2019 в 14:01
поделиться
Другие вопросы по тегам:

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