1

我正在将我们的一些旧数据从丑陋的数据库堆中标准化并迁移到更有用的东西中。

顺便说一句,源数据库是 MSSQL/SQL-Server。
(而且它受到列和表蔓延的困扰,FK 的使用很少,并且在有 FK 的地方,它们经常被破坏,因为某些唯一 ID在某些 UI 用例中发生了变化!!!:)

现在,我正在收集一些客户数据。这里有两大类客户。它们不是相互排斥的。使用的术语相当神秘,因此我将在此处将其简化为UserReseller

就目前而言,源表中有 4 列(是的,4列)可用于确定客户是经销商还是用户is_userisuseris_resellercust_type
cust_type列存储手动输入的值,因此我们也面临拼写/缩写的变化:)

我已经有一些较早的查询,它们分别选择每种客户类型,但现在我想将它们合并到一个 qry 中,其中结果有一个简单的is_user布尔值和一个简单的is_reseller布尔值。

这是我的用户qry 示例(为简洁起见,功能完整):

SELECT TOP 1 name, email, phone
FROM customer 
WHERE  name = '{$row['cust']}'
AND (  isuser=1 
    OR is_user=1
    OR cust_type LIKE 'USER%'
    OR cust_type = 'DIRECT USER' 
)


我的目标是消除该条件,并将其替换为结果集中的附加列以指示是否is_user为 TRUE/FALSE。

这在 SQL(特别是 MS 风格)中有多可行?

4

1 回答 1

4

您可以使用CASE表达式,但您需要确保您的WHERE子句不那么排他性(如果它是同一组标准,那么结果中的每一行都将为真)。

SELECT TOP 1 name, email, phone, is_user = CASE
   WHEN ( isuser = 1 
      OR is_user = 1
      OR cust_type LIKE 'USER%'
      OR cust_type = 'DIRECT USER')
   THEN 1 ELSE 0 END,
 is_reseller = CASE 
   WHEN (...any condition that makes a customer a reseller...)
   THEN 1 ELSE 0 END
FROM dbo.customer
...WHERE...
于 2013-04-02T15:04:00.837 回答