Oracle/PL SQL/SQL параўнанне нуля на ИНЕКЕ

Проста пытанне аб рашэнні будзе абнуліць значэння ў запыце.

Напрыклад, у мяне ёсць наступная табліца з наступнымі палямі і значэннямі

TABLEX
Column1
1        
2        
3      
4        
5      
---------
Column2
null
A
B
C
null

Я прапусканне на пераменны у канкрэтнай працэдуры. Усярэдзіне працэдуры знаходзіцца курсор, як гэта

CURSOR c_results IS
SELECT * FROM TABLEX where column2 = variableY

Зараз гэтая праблема можа быць зменнай ў альбо нуль, А, У або З калі зменнай у роўная нуля, я хачу, каб выбраць усе запісы, дзе column2 мае нулявое значэнне, то яшчэ дзе column2 альбо A, B або C.

Я не магу зрабіць вышэй курсора/запыт, таму што, калі зменнай у роўная нулю, што не будзе працаваць, таму што параўнанне павінна быць

CURSOR c_results IS
SELECT * FROM TABLEX where column2 IS NULL

Які курсор/запыт я павінен выкарыстоўваць гэта прыстасавалі небудзь нулявы або радкі зменнай.

Выбачайце, калі маё пытанне крыху збівае з толку. Я не тое, што добра ў тлумачэнні рэчаў. Загадзя дзякую.

15

8 адказы

Альбо вырабляць розны SQL у залежнасці ад зместу гэтага параметру, або змяніць ваш SQL як гэта:

WHERE (column2 = variableY) OR (variableY IS NULL AND column2 IS NULL)
20
дададзена
біць мяне на секунду :)
дададзена аўтар Randy, крыніца
Вялікі дзякуй Ласэ! працаваў выдатна! дзякуй усім, хто дапамог. :)
дададзена аўтар user2447740, крыніца

абоacle Задаць Том кажа:

where decode( col1, col2, 1, 0 ) = 0  -- finds differences

або

where decode( col1, col2, 1, 0 ) = 1  -- finds sameness - even if both NULL

Safely Comparing NULL Columns as Equal

5
дададзена

Вы маглі б выкарыстоўваць нешта накшталт:

SELECT * FROM TABLEX WHERE COALESCE(column2, '') = COALESCE(variableY, '')

(СОАЬЕЗС займае першае значэнне NULL нон)

Звярніце ўвагу, што гэта будзе працаваць толькі тады, калі ўтрыманне слупка не можа быць «» (пустая радок). Інакш гэта зацвярджэнне не таму, што NULL будзе адпавядаць «» (пустая радок).

(Рэдагаваць) Можна таксама разгледзець наступныя пытанні:

SELECT * FROM TABLEX WHERE COALESCE(column2, 'a string that never occurs') = COALESCE(variableY, 'a string that never occurs')

Гэта дазволіць выправіць «» пацярпець няўдачу гіпотэзу.

2
дададзена
У Oracle NULL <=> NULL. Такім чынам, ваш першы прыклад проста няправільна. Дэманстрацыя
дададзена аўтар lad2025, крыніца

Ніжэй падобны на «верхні» адказ, але больш кароткім:

<�Код> ГДЕ ((= столбец2 зменныя у) або СОАЬЕЗС (столбец2, пераменны у) IS NULL)

1
дададзена
Я згодны, гэта больш кароткім, хоць, магчыма, менш ясна
дададзена аўтар Edd, крыніца
Бачыць дату перад публікацыяй buddy..Also адказу ўжо сумесна.
дададзена аўтар Vimal Bhaskar, крыніца

Try using the ISNULL() function. you can check if the variable is null and if so, set a default return value. camparing null to null is not really possible. remember: null <> null

0
дададзена

Вы можаце выкарыстоўваць DUMP :

SELECT * 
FROM TABLEX 
WHERE DUMP(column2) = DUMP(variableY);

<�Моцны> DBFiddle Demo

Увага: Гэта не SARG-магчымасці выразы, так што не будзе выкарыстання азначніка.

Пры такім падыходзе вам не трэба шукаць значэнне, якое не будзе існуе ў вашых дадзеных (напрыклад, NVL/COALESCE ).

0
дададзена

Можа не быць неабходнасці ў залежнасці ад дадзеных, якія вы глядзіце, але адзін трук, які я бачыў (і выкарыстоўваецца) для параўнання NVL (FIELDNAME, somenonexistentvalue).

Напрыклад, калі AGE з'яўляецца дадатковым калонкі, вы можаце выкарыстаць:

if nvl(table1.AGE,-1) = nvl(table2.AGE,-1)

Гэта залежыць ад наяўнасці значэння, што вы ведаць ніколі не будзе дазволена. Узрост з'яўляецца добрым прыкладам, заработная плата, парадкавыя нумары, і іншыя Лікавыя, якія не могуць быць адмоўнымі. Радкі могуць быць складаней, вядома, - вы можаце сказаць, што вы ніколі не будзеце знаёмага, якога завуць «xyzzymaryhadalittlelamb» ці нешта падобнае, але на наступны дзень вы бяжыце з гэтым меркаваннем вы ведаеце, што яны будуць наймаць каго-то з гэтым імем !!

Усё, што сказаў: «дзе а = Ь або (а роўна нулю і б роўная нулю)» з'яўляецца традыцыйным спосабам вырашыць гэтую праблему. Што сумна, так як нават дасведчаныя праграмісты забываюць, што частка яго часам.

0
дададзена
WHERE variableY is null or column2 = variableY 

for example:
create table t_abc (
id number(19) not null,
name varchar(20)
);

insert into t_abc(id, name) values (1, 'name');
insert into t_abc(id, name) values (2, null);
commit;

select * from t_abc where null is null or name = null;
--get all records

select * from t_abc where 'name' is null or name = 'name';
--get one record with name = 'name'
0
дададзена
Калі ласка, рэдагаваць адказ і дадаць тлумачэнне таго, чаму гэта павінна працаваць.
дададзена аўтар Tushar, крыніца