2016-09-21 3 views
1

Я столкнулся с выражением if then else в oracle, но я не уверен, что является целью двух операторов select count (*). Может кто-нибудь помочь мне в этом. Мне нужно разобрать это, чтобы повторно написать то же самое в t-sql. Спасибо. Вот код:oracle: select from 2 select statements value

BEGIN 
     IF (nEL_ID > 0) THEN 
     select upperMatched||valueMatched INTO sResult 
     from 
      (
      select count(*) as upperMatched 
       from HSIP.FY_ORT_VALUES ov 
      where ov.FY = nFY and OV.EL_ID = nEL_ID 
       and upper(OV.VAL_DESCRIPTION) = upper(sRESPONSE_STRING) 
      )um, 
      (
      select count(*) as valueMatched 
       from HSIP.FY_ORT_VALUES ov 
      where ov.fy = nfy and OV.EL_ID = nEL_ID 
       and OV.VAL_DESCRIPTION = sRESPONSE_STRING 
      )lm; 
     ELSE 
      sResult := '00'; 
     END IF; 
     RETURN sResult; 

SQL-сервер:

CREATE FUNCTION [hsip].[getMatchedFlags] 
(
    @nFY NUMERIC(4,0) = 0, 
    @sResponse_String varchar(250), 
    @nEL_ID NUMERIC(5,0) = 0 
) 

RETURNS @sResult TABLE(FY NUMERIC(4,0), 
Response_string varchar(250), 
el_id numeric(5,0)) 

AS 
BEGIN 

insert into @sResult 

--select * from (select case 
SELECT CASE 
when (@nEL_ID>0) then 

SELECT(CONCAT(

(select count(*) as upperMatched 
       from HSIP.FY_ORT_VALUES ov 
       where ov.FY = @nFY and OV.EL_ID = @nEL_ID 
       and upper(OV.VAL_DESCRIPTION) = upper(@sRESPONSE_STRING)), 

(SELECT COUNT(*) AS valueMatched 
FROM hsip.FY_ORT_VALUES OV 
WHERE OV.FY= @nFY AND OV.el_id= @nEL_ID 
AND OV.VAL_DESCRIPTION= @sResponse_String)) 

ELSE 

SET @SRESULT= 0; 
return; 
+0

это конкатенация двух отсчетов. в оракуле || является конкатенатной строкой. так же, как + для sql-сервера. один из таблицы FY_ORT_VALUES и один из значения, сопоставленного, поэтому, если для 1-го числа было 20, а для второго - 10, то вы получите sResult 2010 года. *** Oracle имеет чувствительность к регистру *** (при условии настроек по умолчанию), поэтому числа возвращаются на основе рассмотрения в ВЕРХНИХ случаях, а второй набор основан на том, как они точно отображаются в базе данных. Если nEl_ID <= 0, вы увидите возвращаемое «00». – xQbert

+0

Включена ли чувствительность к регистру в обеих базах данных? ни? один, но не другой? Я предполагаю, что sResponse_String - это параметр, переданный в чувствительности um, устраняется в чувствительности lm, считается, что если у вас есть VAL_Description в таблице 'Florida', если sResponse_Sting был' florida', он соответствовал бы 'um', но не матч lm. поэтому в результате вы увидите 10. но в SQL-сервере с нечувствительным к регистру DB вы получите 11! – xQbert

+0

Почему числа объединяются? Это просто странно. Но в любом случае, если вы переводите это на T-SQL, используйте функцию CONCAT вместо оператора '+', так как оператор '+' будет добавлять числа математически. – Munir

ответ

1

um и lm являются скалярными подзапросов (каждый возвращает одну строку с точно один столбец, в данном случае, единственное значение, возвращаемое представляет собой число, подсчет того или другого).

SQL (или, по крайней мере, Oracle SQL) позволяет использовать результат скалярных запросов как выражений - в данном случае, как простые числа. Филиал «IF» задает результат sResult как конкатенацию этих двух чисел (после их неявного преобразования в строки).

Это не имеет для меня никакого смысла; если первый счет равен 399, а второй - 1, тогда результатом будет строка «3991» (а не число, а строка). Кстати, если первый счет был 39, а второй 91, вы получите точно такой же результат.

Примечание - как обсуждалось в комментариях ниже этого ответа, я пропустил основной вопрос исходного вопроса. xQbert объясняет значение самих счетчиков в комментарии к исходному вопросу.

+0

Запросы идентичны, за исключением рассмотрения дела. Поэтому первое число всегда будет больше или равно второму числу. – xQbert

+0

@xQbert Я не думаю, что это актуально; если вы конкретно ссылаетесь на мой пример, измените его на 933 и 1 (тот же конечный результат, что и 93 и 31). – mathguy

+0

На вопрос: «Мне нужно отказаться от этого, чтобы повторно написать то же самое в t-sql. Спасибо. Вот код:« ... Чувствительность к регистру отключена по умолчанию в SQL Server, по умолчанию в Oracle.Для меня это очень сильно отличается и может помочь объяснить, почему запросы почти идентичны; и в T-SQL, учитывая, что одни и те же данные могут фактически возвращать разные значения, чем Oracle! – xQbert