Why oracle DB does not update the fileds - sql

I do not know what is wrong with this query but it does not give any error and does not update the row. ENDDATETIME field datatype is TIMESTAMP.
UPDATE TEST_BANK set STATUS = 'RECEIVED', ENDDATETIME = '16-JUN-15 11.21.06.000000000' WHERE ENDDATETIME = null ;

I believe in Oracle the syntax for checking for null is as following
WHERE ENDDATETIME IS NULL
instead of the
WHERE ENDDATETIME = NULL

You can try this
UPDATE TEST_BANK set STATUS = 'RECEIVED', ENDDATETIME = '16-JUN-15 11.21.06.000' WHERE ENDDATETIME is null ;

Your ENDDATETIME format is wrong, hence its not selected.
Just copy paste the column value, and paste it in where clause ..it will work
Are you able to get the result
Select * from TEST_BANK WHERE ENDDATETIME = null ;
Use IS NULL instead of = null

You can't compare NULL values. You'll need the "IS" operator.
UPDATE TEST_BANK
SET STATUS = 'RECEIVED',
ENDDATETIME = '16-JUN-15 11.21.06.000000000'
WHERE ENDDATETIME IS NULL ;
To explain this:
Assume Mr. Little and Mr. Large. You don't know how tall they are (size is null). Now can you positively state that they are of the same size?
If not, they won't be "selected" when compared.
Hence you need a comparion function to test if the value is unknown, which is what the "IS NULL" does.

Operator is always applied on data while NULL is predicate in oracle. So it won't be worked with operator.
When ever you want to deal with NULL always use IS NULL or IS NOT NULL.
Nulls with Comparison Conditions
To test for nulls, use only the comparison conditions IS NULL and IS NOT NULL. If you use any other condition with nulls and the result depends on the value of the null, then the result is UNKNOWN. Because null represents a lack of data, a null cannot be equal or unequal to any value or to another null. However, Oracle considers two nulls to be equal when evaluating a DECODE function. Please refer to DECODE for syntax and additional information.
Oracle also considers two nulls to be equal if they appear in compound keys. That is, Oracle considers identical two compound keys containing nulls if all the non-null components of the keys are equal.

Related

Selecting rows which are not null in sql

Why doesn't the following code work in SQL
SELECT *
FROM DATA
WHERE VALUE != NULL;
we can not Compare null value with = We Special operator to compare null
value in sql
IS OPERATOR
SELECT *
FROM DATA
WHERE VALUE is not NULL;
Null is not any Value.Sql consider Null as Unknown/absence of data.
The condition you written is not in proper format.
If you want to select not null values from your table then you can use the following command
select *from table name where column name IS NOT NULL
If should work if you replace "!=" with "IS NOT".
Because a NULL value indicates an absence of data, it doesn't make sense to compare something with a value to it with an equals operator.
You can make your SELECT statement work by setting ANSI_NULLS OFF
SET ANSI_NULLS OFF
before running the statement. You can get further information here:
https://msdn.microsoft.com/en-us/library/ms188048.aspx
Null does not contain any value. Null is neither zero nor any value.
So we can't compare it using comparision operators.
Instead of using '=', you should use 'IS' keyword.
SELECT * FROM DATA WHERE VALUE IS NOT NULL;
The code will not work in SQL because it is not possible to test for NULL values with the following operators =, <, or <>. It is not possible to compare NULL and 0 as they are not equivalent.
You can test for NULL values using the IS NULL and IS NOT NULL operators instead.
SELECT *
FROM DATA
WHERE VALUE IS NOT NULL
http://www.w3schools.com/sql/sql_null_values.asp

NULL values in SQL server query

I've a Status column in a table which has 3 values - 'N/A' , 'Single' ,'Multiple'. Some rows have a NULL value for the Status column.
I need to pull up all the rows in which Status is not null and is not 'N/A'. Basically, I need all the rows whose status is "Single" or "Multiple".
I've been just reading up about NULL actually being equivalent to 'UNKNOWN'.
If I say
SELECT *
FROM t_userstatus
WHERE status <> 'N/A'
I get the results (All rows containing "Single" or "Multiple" only).
What I would like to know is that , does the above WHERE clause always exclude the rows having NULL values?Is that the expected behaviour?
What causes this to exclude null rows even though I've not explicitly specified it?
In my query,do I have to explicitly say status IS NOT NULL ?
I am relatively new to programming, any help is appreciated.
It is not normal behavior as N/A (Single & Multiple as well) is a string that is not related to NULL. Even though the NULL is evaluated to unknown and may not return, you should explicitly use IS NOT NULL.
SELECT [column_list] FROM t_userstatus
WHERE status IS NOT NULL AND status <> 'N/A'
I would also recommend you get in the habit of specifying a column list.
SQL uses three-valued logic: true, false, and unknown. Any comparison to null results in unknown.
So null <> 'N/A' evaluates to unknown. Since unknown is not true, that means the row gets excluded.
Yes, that is the normal behavior. A NULL value has no value, so it does not satisfy a WHERE condition. If you want to also include null values, you need to specify IS NOT NULL as well.
As others have said, null is generally not comparable. So, a status != 'N/A' comes back as false when status is null.
But what others haven't mentioned yet is that that is controlled through the Ansi_nulls setting. By default it is on and nulls are not comparable (as you state in the question, the principal behind this is that they are unknown so it is false that they are not necessarily N/A). But you can use
SET ANSI_NULLS OFF
To change this behavior in which case a null will be equal to a null and not equal to anything else. There is more details on MSDN here.
A bit non-obviously, SQL has three valued logic (true/false/unknown). Any direct comparison with NULL will result in the value unknown which in the WHERE clause is considered non-true. Your condition;
WHERE status <> 'N/A'
will in other words never match a null since NULL is never "not equal" to anything.
The only ways to match a NULL using a comparison is using the special null operations IS NULL or IS NOT NULL.
As a side note, life is naturally never quite that simple.

Sql identical query but showing different Result

I have written a query in Sql server 2008.
select select * from program
where program_description <> null
But,Result of above query is blank.
whereas the below query is showing me the desired result.
select * from program
where program_description is not null
Is there any difference between them...?
Yes, = and <> do not work with null.
You have to use IS NULL or IS NOT NULL
Yes there is a difference. Comparing something with null will always result in unknown.
That is why you need to compare null results with is null
yes, the difference is -- according to standard, all operation with null return null. Including <>. The only valid way to check null value is operation 'is null'.

Difference between "column is null" and "column = null" in where clause in db2?

I am getting different results when I run the query with above clause but not able to understand why. can any one explain what is the difference between the two clauses.
The result of column = null is unknown (null), since it can't be known what null really is. If you want to test for null and get a boolean value back you need to use is null. So, `column` is null is the correct syntax to use.
A comparison to null always evaluates to false, so column = null evaluates to false as well as column != null, independently of the value of column. If you want to actually check whether a value is null, you have to use column is null.

SQL: Why are NULL values filtered out within this where clause?

In my table, I have a nullable bit column (legacy system...) and another developer recently made a change to a stored procedure to only show values where the bit column was not true (1). Because this is a nullable column, we noticed that if the column was NULL, the record was not being picked up. WHY is this?
Both the other developer and I agree that NULL <> 1... Is this a bug in SQL or was this designed this way? Seems like a design flaw.
Current Code:
(VoidedIndicator <> 1)
Proposed Fix:
(VoidedIndicator <> 1 OR VoidedIndicator IS NULL)
Clarification (By Jon Erickson)
VoidedIndicator is a nullable bit field so it can have the following values: NULL, 0, or 1
When a SQL statement is created with a where clause such as (VoidedIndicator <> 1) we only get records returned that have VoidedIndicator == 0, but we were expecting both VoidedIndicator == 0 and VoidedIndicator IS NULL. Why is this?
Lots of good answers, but let me give you a really concise version.
To SQL, Null does NOT mean "No value" it means "Unknown Value"
With that in mind, consider the answer to the question you are asking SQL in plain English.
Q: Is this unknown value not equal to 1?
A: I don't know, there is no way to tell without knowing the value.
Hence Null<>1 = Null
From the Wikipedia entry on NULL:
For example, a WHERE clause or
conditional statement might compare a
column's value with a constant. It is
often incorrectly assumed that a
missing value would be "less than" or
"not equal to" a constant if that
field contains Null, but, in fact,
such expressions return Unknown. An
example is below:
-- Rows where num is NULL will not be returned,
-- contrary to many users' expectations.
SELECT * FROM sometable WHERE num <> 1;
Basically, any comparison between NULL and something else, whether it's with = or <> will not be true.
As another reference, the MSDN T-SQL page on <> states:
Compares two expressions (a comparison
operator). When you compare nonnull
expressions, the result is TRUE if the
left operand is not equal to the right
operand; otherwise, the result is
FALSE. If either or both operands are
NULL, see SET ANSI_NULLS
(Transact-SQL).
The SET ANSI_NULLS page then states:
When SET ANSI_NULLS is ON, a SELECT
statement that uses WHERE column_name
= NULL returns zero rows even if there are null values in column_name. A
SELECT statement that uses WHERE
column_name <> NULL returns zero rows
even if there are nonnull values in
column_name.
...
When SET ANSI_NULLS is ON, all
comparisons against a null value
evaluate to UNKNOWN. When SET
ANSI_NULLS is OFF, comparisons of all
data against a null value evaluate to
TRUE if the data value is NULL.
It's not a bug.
NULL is not equal to anything, not even NULL (NULL = NULL returns FALSE).
Typically NULL values aren't indexed either. It's generally a bad idea to rely on a particular value or NULL. Depending on what you're storing in the column, you may be better off putting a dummy or sentinel value in rather than using NULL to indicate some meaning.
The other folks are correct that NULL <> 1 doesn't evaluate as true, therefore it doesn't satisfy the WHERE clause.
The proposed fix you describe is the best way of handling it:
(VoidedIndicator <> 1 OR VoidedIndicator IS NULL)
SQL-99 does have a predicate that helps in this case, called IS DISTINCT FROM:
(VoidedIndicator IS DISTINCT FROM 1)
This predicate would behave exactly the same as your proposed fix. Unfortunately, Microsoft SQL Server does not support IS DISTINCT FROM yet.
You can also: isnull(VoidedIndicator,1) <> 1
Because the WHERE clause only selects rows when the condition evaluates to true.
When one of the operands is NULL, the condition usually evaluates to UNKNOWN (approximately equivalent to NULL), and therefore is not true. It applies to both 'column = 1' and 'column <> 1'; if column is NULL, the search condition fails.
It is why you get told to avoid NULL columns whenever possible.
NULL <> 1 evaluates (theoretically) to "maybe", which means the record will not be returned.