Example:
--- CUT ---
create table t(s text);
insert into t values ('1'),('null'),('3');
.print 'BEFORE'
select rowid,* from t;
update t set s = replace(s,'null',null)
--where s = 'null' --adding this works of course but that’s not my point
;
.print 'AFTER'
select rowid,* from t;
--- CUT ---
The documentation says: “The replace(X,Y,Z) function returns a string formed by
substituting string Z for every occurrence of string Y in string X. The BINARY
collating sequence is used for comparisons. If Y is an empty string then return
X unchanged. If Z is not initially a string, it is cast to a UTF-8 string prior
to processing.”
“substituting string Z for every occurrence of string Y” implies that if there
is no occurrence of string Y nothing should happen to the original string,
right?
Accordingly, my expectation is that either:
1. null will remain null as there is not really a string (even empty) that can
truly represent it, or
2. we allow null to be converted to empty string so that the “returns a string”
requirement can be satisfied.
or, maybe
3. using null for the Z part gives an error.
In either [1] or [2] above, however, if the target string (Y part) is not
found, the result should be unaltered.
The replacement seems to occur regardless of the target being found or not.
... and everything becomes null.
Note: I know SQLite3 tries to mimic in some ways Postgres, so I tried with it
also, and got the same unexpected behavior.
From a quick look, I haven’t seen anything in their documentation on REPLACE to
justify it either.
I consider this behavior wrong, or (easier way out) the documentation should
make a special note about null behaving the way it does.
Thank you.
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users