【问题标题】:SQL Server Boolean Expression evaluationSQL Server 布尔表达式求值
【发布时间】:2009-09-15 20:57:57
【问题描述】:

我有一个存储县评估区数据的表。我想添加一个计算列来告诉我该物业是否是自住的。如果属性地址与所有者地址相同,我将“所有者占用”定义为true,否则定义为false。

由于县源数据输入不准确,如果我进行严格的文本比较,我会得到很多虚假的非自住结果。所以我想测试“如果该物业的街道名称不在业主地址中,或者如果该物业的地址号码不在业主地址中,那么这是非业主自用物业”

我写了以下内容:

更改表 appriasaldata 添加 IsOwner占用为 案子 ((charindex(locastreetnumber, owneraddress) = 0) 或 (charindex(locastreetname, owneraddress) = 0)) 当 TRUE 时 1 否则 0 结束

SQL Server 不喜欢 CHARINDEX 函数后面的 = 符号。我怎样才能重写它以使 SQL Server 可以接受? (如果重要的话,我使用的是 SQL Server 2005。)

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql


    【解决方案1】:

    表达式在 SQL Server 中不能返回 true 或 false。 (无布尔类型)但您可以将整个表达式移动到 when 中,例如:

    alter table appriasaldata add 
        IsOwnerOccupied as 
         case when ((charindex(locastreetnumber, owneraddress) = 0) 
              or (charindex(locastreetname, owneraddress) = 0))
            THEN 1 ELSE 0
         end
    

    【讨论】:

      【解决方案2】:

      您不能将布尔表达式放入案例查找列表中。与 C 类型语言不同,在 T-SQL 中,布尔值不能与其他值进行比较。最后但同样重要的是,Transact-SQL 没有 TRUE 和 FALSE。

      因此,您需要将布尔表达式移入 case WHEN,它需要一个布尔值:

      alter table appriasaldata add 
          IsOwnerOccupied as 
           case when
              (charindex(locastreetnumber, owneraddress) = 0) 
             or (charindex(locastreetname, owneraddress) = 0)
               THEN 1 ELSE 0
           end
      

      【讨论】:

        【解决方案3】:

        我想出了和 Shannon Severance 一样的想法。

        该代码是正确的计算列。

        用这个简单的代码测试这个想法:

        DECLARE @appriasaldata TABLE (
            owneraddress        varchar(100),
            locastreetnumber    varchar(100),
            locastreetname      varchar(100)
        )
        
        INSERT INTO @appriasaldata (
            owneraddress,
            locastreetnumber,
            locastreetname
        )
        VALUES (
            '2701 SW Vaughn Street, Portland, OR',
            '2701',
            'SW Vaughn Street'
        )
        
        SELECT
            owneraddress,
            locastreetnumber,
            locastreetname,
            charindex(locastreetnumber, owneraddress),
            charindex(locastreetname,   owneraddress),
            CASE
                WHEN charindex(locastreetnumber, owneraddress) <> 0
                  or charindex(locastreetname,   owneraddress) <> 0
                THEN 1
                ELSE 0
            END
        FROM @appriasaldata
        

        【讨论】:

          【解决方案4】:

          试试这个:

          SELECT
              owneraddress,
              locastreetnumber,
              locastreetname,
              charindex(locastreetnumber, owneraddress),
              charindex(locastreetname,   owneraddress),
              CASE
                  WHEN charindex(locastreetnumber,
                                 owneraddress)
                      +charindex(locastreetname,
                                 owneraddress)    > 0
                  THEN 1
                  ELSE 0
              END
          FROM @appriasaldata
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-29
            • 2015-08-03
            • 1970-01-01
            • 2016-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-04
            相关资源
            最近更新 更多