Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. Other Discussions
  3. The Weird and The Wonderful
  4. Does NULL <> 'string'?

Does NULL <> 'string'?

Scheduled Pinned Locked Moved The Weird and The Wonderful
databasehelpquestion
55 Posts 20 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Jorgen Andersson

    Boring?

    Wrong is evil and must be defeated. - Jeff Ello

    T Offline
    T Offline
    TheGreatAndPowerfulOz
    wrote on last edited by
    #20

    They don't all "enjoy" it. It's a job. Indeed, prostitutes go same-sex for their personal one-on-ones because opposite-sex has lost all appeal due to the "job".

    #SupportHeForShe Government can give you nothing but what it takes from somebody else. A government big enough to give you everything you want is big enough to take everything you've got, including your freedom.-Ezra Taft Benson You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun

    1 Reply Last reply
    0
    • J Jeremy Falcon

      So is prostitution... but ya know... :~

      Jeremy Falcon

      J Offline
      J Offline
      Jagger B
      wrote on last edited by
      #21

      Sorry, You failed the interview. He'll call you next time. :|

      J 1 Reply Last reply
      0
      • J Jagger B

        Sorry, You failed the interview. He'll call you next time. :|

        J Offline
        J Offline
        Jeremy Falcon
        wrote on last edited by
        #22

        So wait, you're saying I can't be a prostitute? Why? Because I'm a guy? That's discrimination.

        Jeremy Falcon

        J 1 Reply Last reply
        0
        • J Jeremy Falcon

          So wait, you're saying I can't be a prostitute? Why? Because I'm a guy? That's discrimination.

          Jeremy Falcon

          J Offline
          J Offline
          Jagger B
          wrote on last edited by
          #23

          Are you saying, Sql Dev's = prostitute?

          J 1 Reply Last reply
          0
          • J Jagger B

            Are you saying, Sql Dev's = prostitute?

            J Offline
            J Offline
            Jeremy Falcon
            wrote on last edited by
            #24

            Yes. Everyone knows you have go through prostitute training to get certified. You just finding this out? You may wanna talk to your MS rep.

            Jeremy Falcon

            N 1 Reply Last reply
            0
            • OriginalGriffO OriginalGriff

              It gets Dali-esque as well from time to time...

              Bad command or file name. Bad, bad command! Sit! Stay! Staaaay... AntiTwitter: @DalekDave is now a follower!

              N Offline
              N Offline
              Nelek
              wrote on last edited by
              #25

              OriginalGriff wrote:

              Dali-esque

              Surrealistic? or womenizer? :laugh: :laugh: :laugh: :laugh:

              M.D.V. ;) If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about? Help me to understand what I'm saying, and I'll explain it better to you Rating helpful answers is nice, but saying thanks can be even nicer.

              G 1 Reply Last reply
              0
              • J Jeremy Falcon

                Yes. Everyone knows you have go through prostitute training to get certified. You just finding this out? You may wanna talk to your MS rep.

                Jeremy Falcon

                N Offline
                N Offline
                Nelek
                wrote on last edited by
                #26

                Guys... this is not the soapbox

                M.D.V. ;) If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about? Help me to understand what I'm saying, and I'll explain it better to you Rating helpful answers is nice, but saying thanks can be even nicer.

                T 1 Reply Last reply
                0
                • C Chris Maunder

                  You'd think so. Except in SQL We had a query:

                  Select count(*)
                  From TableOne

                  which returned, say, 500,000 records. Next we added

                  Select count(*)
                  From TableOne
                  Left Join TableTwo On TableTwo.TableTwoID = TableOne.TableTwoID
                  Where TableTwo.TableTwoID is null or TableTwo.StringColumn <> 'value'

                  We're trying to find the number of records in TableOne which, when joined with TableTwo, either have no corresponding TableTwo row or the corresponding TableTwo row is not 'value'. TableTwo.StringColumn is nullable. The result? Adding the join resulted in 25K records. It should have been over 490K records. The issue?

                  TableTwo.StringColumn <> 'value'

                  This comparison returns false if TableTwo.StringColumn is null. So one needs to use

                  IsNull(TableTwo.StringColumn, '') <> 'value'

                  to get the correct result.

                  cheers Chris Maunder

                  T Offline
                  T Offline
                  txmrm
                  wrote on last edited by
                  #27

                  Like everything else in programming, it depends. In this case it depends on the SQL ansi_nulls setting. If this is a statement inside a SQL stored procedure, view, etc the ansi_nulls setting is burned into the object when it is created. If this is an ad-hoc statement then the ansi_nulls setting in effect for the SQL connection the statement is executed against is used. If you want null <> 'value' to return true, you could just set ansi_nulls off. Not that I would recommend doing that...

                  Richard DeemingR 1 Reply Last reply
                  0
                  • T txmrm

                    Like everything else in programming, it depends. In this case it depends on the SQL ansi_nulls setting. If this is a statement inside a SQL stored procedure, view, etc the ansi_nulls setting is burned into the object when it is created. If this is an ad-hoc statement then the ansi_nulls setting in effect for the SQL connection the statement is executed against is used. If you want null <> 'value' to return true, you could just set ansi_nulls off. Not that I would recommend doing that...

                    Richard DeemingR Offline
                    Richard DeemingR Offline
                    Richard Deeming
                    wrote on last edited by
                    #28

                    txmrm wrote:

                    Not that I would recommend doing that...

                    Especially as it's deprecated, and likely to be removed:

                    SET ANSI_NULLS (Transact-SQL) | Microsoft Docs[^]:

                    In a future version of SQL Server, ANSI_NULLS will always be ON and any applications that explicitly set the option to OFF will generate an error. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.


                    "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                    "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

                    1 Reply Last reply
                    0
                    • C Chris Maunder

                      You'd think so. Except in SQL We had a query:

                      Select count(*)
                      From TableOne

                      which returned, say, 500,000 records. Next we added

                      Select count(*)
                      From TableOne
                      Left Join TableTwo On TableTwo.TableTwoID = TableOne.TableTwoID
                      Where TableTwo.TableTwoID is null or TableTwo.StringColumn <> 'value'

                      We're trying to find the number of records in TableOne which, when joined with TableTwo, either have no corresponding TableTwo row or the corresponding TableTwo row is not 'value'. TableTwo.StringColumn is nullable. The result? Adding the join resulted in 25K records. It should have been over 490K records. The issue?

                      TableTwo.StringColumn <> 'value'

                      This comparison returns false if TableTwo.StringColumn is null. So one needs to use

                      IsNull(TableTwo.StringColumn, '') <> 'value'

                      to get the correct result.

                      cheers Chris Maunder

                      Kornfeld Eliyahu PeterK Offline
                      Kornfeld Eliyahu PeterK Offline
                      Kornfeld Eliyahu Peter
                      wrote on last edited by
                      #29

                      It may be weird, but it's nothing new... I learned SQL on mainframe, and the first thing we had to memorize about NULL is that it can not stand of either side of any of the comparison operators (=, <, >, <>)...

                      Skipper: We'll fix it. Alex: Fix it? How you gonna fix this? Skipper: Grit, spit and a whole lotta duct tape.

                      "It never ceases to amaze me that a spacecraft launched in 1977 can be fixed remotely from Earth." ― Brian Cox

                      1 Reply Last reply
                      0
                      • C Chris Maunder

                        You'd think so. Except in SQL We had a query:

                        Select count(*)
                        From TableOne

                        which returned, say, 500,000 records. Next we added

                        Select count(*)
                        From TableOne
                        Left Join TableTwo On TableTwo.TableTwoID = TableOne.TableTwoID
                        Where TableTwo.TableTwoID is null or TableTwo.StringColumn <> 'value'

                        We're trying to find the number of records in TableOne which, when joined with TableTwo, either have no corresponding TableTwo row or the corresponding TableTwo row is not 'value'. TableTwo.StringColumn is nullable. The result? Adding the join resulted in 25K records. It should have been over 490K records. The issue?

                        TableTwo.StringColumn <> 'value'

                        This comparison returns false if TableTwo.StringColumn is null. So one needs to use

                        IsNull(TableTwo.StringColumn, '') <> 'value'

                        to get the correct result.

                        cheers Chris Maunder

                        O Offline
                        O Offline
                        obermd
                        wrote on last edited by
                        #30

                        The SQL standards don't define how NULL should behave. What you found is accurate for one SQL dialect but may not be accurate for another. This is actually one of the biggest challenges when changing RDBMS vendors.

                        Richard DeemingR 1 Reply Last reply
                        0
                        • C Chris Maunder

                          You'd think so. Except in SQL We had a query:

                          Select count(*)
                          From TableOne

                          which returned, say, 500,000 records. Next we added

                          Select count(*)
                          From TableOne
                          Left Join TableTwo On TableTwo.TableTwoID = TableOne.TableTwoID
                          Where TableTwo.TableTwoID is null or TableTwo.StringColumn <> 'value'

                          We're trying to find the number of records in TableOne which, when joined with TableTwo, either have no corresponding TableTwo row or the corresponding TableTwo row is not 'value'. TableTwo.StringColumn is nullable. The result? Adding the join resulted in 25K records. It should have been over 490K records. The issue?

                          TableTwo.StringColumn <> 'value'

                          This comparison returns false if TableTwo.StringColumn is null. So one needs to use

                          IsNull(TableTwo.StringColumn, '') <> 'value'

                          to get the correct result.

                          cheers Chris Maunder

                          A Offline
                          A Offline
                          agolddog
                          wrote on last edited by
                          #31

                          Total guess here, but I wonder if the SQL engine errors on the side of caution. Something like: "I don't have a string to compare to. Thus, I can't say with certainty it is or is not 'value', so I'll return false." But yeah, I think that has gotten us all at one time or another when doing inequality in a query. I also wonder if it varies with different implementations of SQL. But not enough to, you know, test it or anything.

                          1 Reply Last reply
                          0
                          • L Lost User

                            Yes, and it is pretty correct. NULL is not defined and can therefore not be compared to a value. Also not for nuallable type in c#.

                            M Offline
                            M Offline
                            Member_5893260
                            wrote on last edited by
                            #32

                            ...except there's an "or" in there: logically, it shouldn't matter: if it's null, at least one of the conditions is true. I have a feeling that "null=string" evaluates to null, and then "field is null" evaluates to Boolean, then "boolean or null" evaluates to null, which is why it doesn't work. But that's somewhat abstruse. Which server is this: is it SQL Server or MySQL... or perhaps something else?

                            L Richard DeemingR 2 Replies Last reply
                            0
                            • M Member_5893260

                              ...except there's an "or" in there: logically, it shouldn't matter: if it's null, at least one of the conditions is true. I have a feeling that "null=string" evaluates to null, and then "field is null" evaluates to Boolean, then "boolean or null" evaluates to null, which is why it doesn't work. But that's somewhat abstruse. Which server is this: is it SQL Server or MySQL... or perhaps something else?

                              L Offline
                              L Offline
                              Lost User
                              wrote on last edited by
                              #33

                              But the IS NULL check is made on TableTwo.TableTwoID While string compare is made with TableTwo.StringColumn So I see no incorrect handling, but of course it is not very intuitiv.

                              M 1 Reply Last reply
                              0
                              • C Chris Maunder

                                You'd think so. Except in SQL We had a query:

                                Select count(*)
                                From TableOne

                                which returned, say, 500,000 records. Next we added

                                Select count(*)
                                From TableOne
                                Left Join TableTwo On TableTwo.TableTwoID = TableOne.TableTwoID
                                Where TableTwo.TableTwoID is null or TableTwo.StringColumn <> 'value'

                                We're trying to find the number of records in TableOne which, when joined with TableTwo, either have no corresponding TableTwo row or the corresponding TableTwo row is not 'value'. TableTwo.StringColumn is nullable. The result? Adding the join resulted in 25K records. It should have been over 490K records. The issue?

                                TableTwo.StringColumn <> 'value'

                                This comparison returns false if TableTwo.StringColumn is null. So one needs to use

                                IsNull(TableTwo.StringColumn, '') <> 'value'

                                to get the correct result.

                                cheers Chris Maunder

                                K Offline
                                K Offline
                                Kirk 10389821
                                wrote on last edited by
                                #34

                                You stumbled on the NULL value special case. NOTHING can be compared to NULL. In fact NULL <> NULL... ISNULL() is the correct way, or (X IS NULL) It makes for difficult code to write with dynamic where clauses on nullable fields. I have seen SOME DBs that they treat '' as NULL and it is worse with a varchar field that trims trailing spaces, and someone stores a space. This is BY DESIGN as explained, and part of the "CALCULUS" of the system. ALSO (1 = NULL) is NOT false... It is NULL That prevents inverting the logic to "NOT (1 = NULL)" Learn that ONCE, learn it well, and life becomes easier.

                                C 1 Reply Last reply
                                0
                                • K Kirk 10389821

                                  You stumbled on the NULL value special case. NOTHING can be compared to NULL. In fact NULL <> NULL... ISNULL() is the correct way, or (X IS NULL) It makes for difficult code to write with dynamic where clauses on nullable fields. I have seen SOME DBs that they treat '' as NULL and it is worse with a varchar field that trims trailing spaces, and someone stores a space. This is BY DESIGN as explained, and part of the "CALCULUS" of the system. ALSO (1 = NULL) is NOT false... It is NULL That prevents inverting the logic to "NOT (1 = NULL)" Learn that ONCE, learn it well, and life becomes easier.

                                  C Offline
                                  C Offline
                                  Chris Maunder
                                  wrote on last edited by
                                  #35

                                  I've learned it many time. My brain, however, refuses to store it in long term memory.

                                  cheers Chris Maunder

                                  1 Reply Last reply
                                  0
                                  • N Nelek

                                    OriginalGriff wrote:

                                    Dali-esque

                                    Surrealistic? or womenizer? :laugh: :laugh: :laugh: :laugh:

                                    M.D.V. ;) If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about? Help me to understand what I'm saying, and I'll explain it better to you Rating helpful answers is nice, but saying thanks can be even nicer.

                                    G Offline
                                    G Offline
                                    Gary Wheeler
                                    wrote on last edited by
                                    #36

                                    Nelek wrote:

                                    womenizer?

                                    My experience is that SQL lacks, er, discrimination in who it molests.

                                    Software Zen: delete this;

                                    1 Reply Last reply
                                    0
                                    • M Member_5893260

                                      ...except there's an "or" in there: logically, it shouldn't matter: if it's null, at least one of the conditions is true. I have a feeling that "null=string" evaluates to null, and then "field is null" evaluates to Boolean, then "boolean or null" evaluates to null, which is why it doesn't work. But that's somewhat abstruse. Which server is this: is it SQL Server or MySQL... or perhaps something else?

                                      Richard DeemingR Offline
                                      Richard DeemingR Offline
                                      Richard Deeming
                                      wrote on last edited by
                                      #37

                                      Dan Sutton wrote:

                                      I have a feeling that "null=string" evaluates to null, and then "field is null" evaluates to Boolean, then "boolean or null" evaluates to null, which is why it doesn't work.

                                      Pretty much, but it depends on the operator and the boolean value. If it's possible to short-circuit the operator, it doesn't matter if one condition is Null.

                                      AND | True | False | Null

                                      True | True | False | Null
                                      False | False | False | False
                                      Null | Null | False | Null

                                      OR | True | False | Null

                                      True | True | True | True
                                      False | True | False | Null
                                      Null | True | Null | Null

                                      It's sometimes easier to think of Null as "unknown". :)


                                      "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                                      "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

                                      M 1 Reply Last reply
                                      0
                                      • L Lost User

                                        But the IS NULL check is made on TableTwo.TableTwoID While string compare is made with TableTwo.StringColumn So I see no incorrect handling, but of course it is not very intuitiv.

                                        M Offline
                                        M Offline
                                        Member_5893260
                                        wrote on last edited by
                                        #38

                                        Yeah - you're right. Hadn't had coffee yet. LOL!

                                        L 1 Reply Last reply
                                        0
                                        • Richard DeemingR Richard Deeming

                                          Dan Sutton wrote:

                                          I have a feeling that "null=string" evaluates to null, and then "field is null" evaluates to Boolean, then "boolean or null" evaluates to null, which is why it doesn't work.

                                          Pretty much, but it depends on the operator and the boolean value. If it's possible to short-circuit the operator, it doesn't matter if one condition is Null.

                                          AND | True | False | Null

                                          True | True | False | Null
                                          False | False | False | False
                                          Null | Null | False | Null

                                          OR | True | False | Null

                                          True | True | True | True
                                          False | True | False | Null
                                          Null | True | Null | Null

                                          It's sometimes easier to think of Null as "unknown". :)


                                          "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                                          M Offline
                                          M Offline
                                          Member_5893260
                                          wrote on last edited by
                                          #39

                                          I know: I failed to see first time around that the comparisons were made on separate columns. Coffee. It's a mandatory component first thing in the morning. Of course, not having had any, I failed to realise that, too!

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups