ОБЪЕДИНИТЕ - гарантировал, что закоротил?

Я нашел ответ сам. испытать превосходство Вот он

var userId = localStorage.getItem('keyName');

    var dbRefName = firebase.database().ref().child('Web App').child('Users').child(userId).child('Name');

     dbRefName.on("value", function(snapshot) {
      console.log(snapshot.val());

      document.getElementById('Name').value = snapshot.val();

    }, function (errorObject) {
      console.log("The read failed: " + errorObject.code);
    });

И тег ввода должен выглядеть вот так.

<input type="text"
       id="Name"
       class="form-control form-control-alternative"
       placeholder="User Name"
       >
11
задан Community 23 May 2017 в 10:29
поделиться

3 ответа

Я просто взглянул на связанную статью и могу подтвердить, что срывание может перестать работать и для ОБЪЕДИНИТЬ и для ISNULL.

Это, кажется, перестало работать, если у Вас есть какой-либо включенный подзапрос, но это хорошо работает для скалярных функций и трудно кодированных значений.

Например,

DECLARE @test INT
SET @test = 1
PRINT 'test2'
SET @test = COALESCE(@test, (SELECT COUNT(*) FROM sysobjects))
SELECT 'test2', @test
-- OUCH, a scan through sysobjects

ОБЪЕДИНИТЕ реализован согласно стандарту ANSI. Это - просто сокращение от Оператора выбора. ISNULL не является частью стандарта ANSI. Раздел 6.9, кажется, не требует срывания явно, но это действительно подразумевает что первый истинный пункт в when оператор должен быть возвращен.

Вот некоторое доказательство, которое является работами для основанных на скаляре функций (я выполнил его на SQL Server 2005):

CREATE FUNCTION dbo.evil
(
)
RETURNS int
AS
BEGIN
    -- Create an huge delay
    declare @c int
    select @c = count(*) from sysobjects a
    join sysobjects b on 1=1
    join sysobjects c on 1=1
    join sysobjects d on 1=1
    join sysobjects e on 1=1
    join sysobjects f on 1=1
    return @c / 0
END
go

select dbo.evil()
-- takes forever

select ISNULL(1,  dbo.evil())
-- very fast

select COALESCE(1,  dbo.evil())
-- very fast

Вот некоторое доказательство, что конкретная реализация со СЛУЧАЕМ выполнит запросы sub.

DECLARE @test INT
SET @test = 1
select
    case
        when @test is not null then @test
        when @test = 2 then (SELECT COUNT(*) FROM sysobjects)
        when 1=0 then (SELECT COUNT(*) FROM sysobjects)
        else (SELECT COUNT(*) FROM sysobjects)
    end
-- OUCH, two table scans. If 1=0, it does not result in a table scan.
8
ответ дан 3 December 2019 в 09:21
поделиться

Я был также удивлен видеть тот ответ работы! Я не уверен, что это поведение гарантируется. (Но я не смог найти пример, который не работает!)

Пять лет SQL, и я все еще удивлен.

Я также шел вперед и сделал еще одно изменение:

INSERT INTO #Fractions VALUES (0, 0)

SELECT Numerator
    ,Denominator
    ,coalesce (
        CASE WHEN Denominator = 0 THEN 0 ELSE NULL END,
        CASE WHEN Numerator <> 0 THEN Numerator / Denominator ELSE NULL END)
     AS TestCalc
FROM #Fractions

Результат, который я получил, был:

Numerator   Denominator TestCalc
1             1           1
1             2           0.5
1             3           0.3333333333333335
1             0           0
2             0           0
3             0           0
0             0           0

Теперь я еще более смущен! Для случая, когда num=0 и den=0, как, я получаю testcalc как 0 (тем более, что я удалил 0 после последнего случая!)?

1
ответ дан 3 December 2019 в 09:21
поделиться

Эффективный способ гарантировать короткое замыкание в SQL Server MS к варианту использования. Для успеха, КОГДА пункт, никакие другие не оценены.

ОБЪЕДИНИТЕ может иметь проблемы

В этом экземпляре, почему имеет столько ответвлений в ОБЪЕДИНИТЬ/ЗАКЛЮЧИТЬ В КОРПУС конструкциях?

SELECT Numerator
    ,Denominator
    ,CASE
        WHEN Denominator = 0 THEN 0 END,
        ELSE Numerator / Denominator
     END AS TestCalc
FROM Fractions
3
ответ дан 3 December 2019 в 09:21
поделиться
Другие вопросы по тегам:

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