Я думаю, что это лучше справится с этим:
my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}
def validate(x, y, z):
for ele in [x, y, z]:
if ele in my_dict.keys():
return my_dict[ele]
Выход:
print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
Вы можете создать такую обертку, как это:
function get_something(name in varchar2,
ignore_notfound in varchar2) return varchar2
is
begin
return get_something (name, (upper(ignore_notfound) = 'TRUE') );
end;
, а затем вызывать:
select get_something('NAME', 'TRUE') from dual;
Вам решать, какие допустимые значения ignore_notfound находятся в вашей версии, Я предположил, что TRUE означает TRUE, а что-то еще означает FALSE.
Вы можете получить Boolean значение из запроса SELECT, вы просто не можете использовать тип данных Boolean.
Вы можете представлять логическое значение с 1/0.
CASE WHEN (10 > 0) THEN 1 ELSE 0 END (It can be used in SELECT QUERY)
SELECT CASE WHEN (10 > 0) THEN 1 ELSE 0 END AS MY_BOOLEAN_COLUMN
FROM DUAL
Возвращает, 1 (в Hibernate / Mybatis / etc 1 истинно). В противном случае вы можете получить печатные логические значения из SELECT.
SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN
FROM DUAL
Это возвращает строку 'true'
.
PL / SQL жалуется, что TRUE не является допустимым идентификатором или переменной. Настройте локальную переменную, установите ее в TRUE и передайте ее в функцию get_something.
Как насчет использования выражения, которое оценивается как TRUE (или FALSE)?
select get_something('NAME', 1 = 1) from dual
Из документации :
Вы не можете вставлять значения
blockquote>TRUE
иFALSE
в столбец базы данных. Вы не можете выбрать или получить значения столбца в переменнойBOOLEAN
. Функции, вызываемые из запросаSQL
, не могут принимать какие-либо параметрыBOOLEAN
. Также нет встроенных функцийSQL
, таких какTO_CHAR
; для представления значенийBOOLEAN
на выходе, вы должны использовать конструкцииIF-THEN
илиCASE
для перевода значенийBOOLEAN
в какой-либо другой тип, например0
или1
,'Y'
или'N'
,'true'
или'false'
и т. д.Вам нужно будет создать функцию-обертку, которая будет использовать тип данных
SQL
и использовать его вместо этого.
Тип данных BOOLEAN - это тип данных PL / SQL. Oracle не предоставляет эквивалентный тип данных SQL (...), вы можете создать функцию-оболочку, которая отображает тип SQL в тип BOOLEAN.
blockquote>Проверьте это: http: / /forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284
Скомпилируйте это в своей базе данных и начните использовать логические операторы в ваших запросах.
note: функция get является параметром varchar2, поэтому не забудьте обернуть любые «строки» в ваш оператор. Он вернет 1 для true и 0 для false,
select bool('''abc''<''bfg''') from dual;
CREATE OR REPLACE function bool(p_str in varchar2) return varchar2
is
begin
execute immediate ' begin if '||P_str||' then
:v_res := 1;
else
:v_res := 0;
end if; end;' using out v_res;
return v_res;
exception
when others then
return '"'||p_str||'" is not a boolean expr.';
end;
/
Ответ на этот вопрос просто поставлен: Не используйте BOOLEAN с Oracle - PL / SQL немой, и он не работает. Для запуска процесса используйте другой тип данных.
Замечание для разработчиков отчетов SSRS с использованием Oracle datasource: вы можете использовать параметры BOOLEAN, но будьте осторожны с тем, как вы реализуете. Oracle PL / SQL отлично не работает с BOOLEAN, но вы можете использовать значение BOOLEAN в Tablix Filter, если данные находятся в вашем наборе данных. Это действительно сработало, потому что я использовал параметр BOOLEAN с источником данных Oracle. Но в этом случае я фильтровал данные Tablix, а не SQL-запрос.
Если данные НЕ находятся в ваших полях SSRS Dataset, вы можете переписать SQL что-то вроде этого с помощью параметра INTEGER:
__
<ReportParameter Name="paramPickupOrders">
<DataType>Integer</DataType>
<DefaultValue>
<Values>
<Value>0</Value>
</Values>
</DefaultValue>
<Prompt>Pickup orders?</Prompt>
<ValidValues>
<ParameterValues>
<ParameterValue>
<Value>0</Value>
<Label>NO</Label>
</ParameterValue>
<ParameterValue>
<Value>1</Value>
<Label>YES</Label>
</ParameterValue>
</ParameterValues>
</ValidValues>
</ReportParameter>
...
<Query>
<DataSourceName>Gmenu</DataSourceName>
<QueryParameters>
<QueryParameter Name=":paramPickupOrders">
<Value>=Parameters!paramPickupOrders.Value</Value>
</QueryParameter>
<CommandText>
where
(:paramPickupOrders = 0 AND ordh.PICKUP_FLAG = 'N'
OR :paramPickupOrders = 1 AND ordh.PICKUP_FLAG = 'Y' )
Если данные находятся в ваших полях SSRS Dataset Fields, вы можете использовать фильтр tablix с параметром BOOLEAN:
__
</ReportParameter>
<ReportParameter Name="paramFilterOrdersWithNoLoad">
<DataType>Boolean</DataType>
<DefaultValue>
<Values>
<Value>false</Value>
</Values>
</DefaultValue>
<Prompt>Only orders with no load?</Prompt>
</ReportParameter>
...
<Tablix Name="tablix_dsMyData">
<Filters>
<Filter>
<FilterExpression>
=(Parameters!paramFilterOrdersWithNoLoad.Value=false)
or (Parameters!paramFilterOrdersWithNoLoad.Value=true and Fields!LOADNUMBER.Value=0)
</FilterExpression>
<Operator>Equal</Operator>
<FilterValues>
<FilterValue DataType="Boolean">=true</FilterValue>
</FilterValues>
</Filter>
</Filters>
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;