【发布时间】:2015-06-01 15:26:48
【问题描述】:
不幸的是,我不是编码员……我以前使用过 CASE 语句,但没有与“LIKE”结合使用。我不确定我的问题是否与 CASE 或其他问题有关。
我正在使用 proc sql (SAS) 来识别购买了由 COMPANY 和 PROD_LONG_NM 中的字词定义的特定产品的案例。这将是每个 COMPANY 和 PROD-LONG_NM 组合所必需的一系列语句。
任何符合定义的案例都将被标记,然后可以排除在其余语句的进一步考虑之外——如果它们不符合定义,那么它们需要被后续语句考虑,直到它们满足一个……
例如,此语句运行时没有(语法)错误,但在逻辑上直到 fire_smbiz_conv 才找到任何情况,然后不是所有情况。最后的六个语句选择了所有的情况,而没有省略之前的 CASE/LIKE 语句应该选择的内容:
case when company='MUTUAL FUNDS' and (PROD_LONG_NM LIKE '401') or (PROD_LONG_NM LIKE 'SEP') or (PROD_LONG_NM LIKE 'SIMPLE')
then 1 else 0 end as mf_smbiz_conv,
case when company='BANK' and (PROD_LONG_NM LIKE 'BUSINESS')
then 1 else 0 end as bk_smbiz_conv,
case when company='AUTO' and (PROD_LONG_NM LIKE 'COMMERCIAL') or (PROD_LONG_NM LIKE 'ENOL') or (PROD_LONG_NM LIKE 'BUSINESS')
then 1 else 0 end as auto_smbiz_conv,
case when company='FIRE' and (PROD_LONG_NM LIKE 'BUSINESS') or (PROD_LONG_NM LIKE 'COMMERCIAL') or (PROD_LONG_NM LIKE 'CONTRACTORS')
or (PROD_LONG_NM LIKE 'RANCH') or (PROD_LONG_NM LIKE 'FIDELITY') or (PROD_LONG_NM LIKE 'RENTAL')
or (PROD_LONG_NM LIKE 'SURETY') or (PROD_LONG_NM LIKE 'WORKERS')
then 1 else 0 end as fire_smbiz_conv,
case when company='AUTO' then 1 else 0 end as oth_auto_conv,
case when company='FIRE' then 1 else 0 end as oth_fire_conv,
case when company='LIFE' then 1 else 0 end as oth_life_conv,
case when company='HEALTH' then 1 else 0 end as oth_health_conv,
case when company='MUTUAL FUNDS' then 1 else 0 end as oth_mf_conv,
case when company='BANK' then 1 else 0 end as oth_bank_conv
【问题讨论】:
-
无论如何,您都没有正确使用 LIKE。您的用法与您使用
=时没有什么不同。 -
您的意思是结合 CASE 还是我可以使用较短的格式,例如 (PROD_LONG_NM LIKE 'xxxx', 'xxxxxx')。 SAS手册有一个例子:job_code like 'xxx';
-
LIKE关键字允许您使用通配符,例如%和_。如果你不使用通配符,它并不比=好。该手册可能假定您已经知道 SQL 通配符的工作原理。 -
很高兴知道,因为也许我应该使用 CONTAINS 代替 - 我不想被字面限制在引号中。
-
好的 - 所以将所有 LIKE 更改为 CONTAINS,看起来好多了。我现在看到的主要问题是我需要排除那些在例如来自后来的 oth_auto_conv 的 auto_smbiz_conv,这段代码似乎包含了它们。
标签: sql-like case-statement proc-sql