我在Username
列中有字符串值。
示例用户名:
USERNAME
--------
foobar123
john
smith23
steve
peter
king213
末尾带有数字的用户名表示这些用户不再处于活动状态。我想在一个Select语句中将这些用户名分为两列Active
和Not_Active
,因为我会将这些用于报告目的。
结果应该是:
Active Not_Active
john foobar123
steve smith23
peter king213
查询:
SELECT
Username,
(
CASE Username
WHEN '%[0-9]%' THEN 'Not'
ELSE 'Active'
END
)
FROM
Users;
我试过Case,但我不知道如何获取用户名值。
答案 0 :(得分:1)
扩展我对原始帖子的评论回复,您不希望相同输出结果集中的数据;相反,你会想要两个结果集(即两个表),每个结果集都有不同的标准。
请注意,您不能将LIKE
字符串匹配(%
)与SQL中的WHEN
语句一起使用。你必须在CASE WHEN
语句中使用它(一个没有"开关"表达式)
-- Result set one: Active users
SELECT
UserName
FROM
Users
WHERE
UserName NOT LIKE '%[0-9]';
-- Result set two: Inactive users
SELECT
UserName
FROM
Users
WHERE
UserName LIKE '%[0-9]';
如果您真的想要,可以将这两个查询组合成一个结果集,其中包含不同列中的数据。这可以通过向每个中间表添加ROW_NUMBER()
列,然后在FULL OUTER JOIN
上执行ROW_NUMBER()
来完成,但是在任何使用客户端代码中迭代输出结果都是毫无意义和痛苦的
另一个选项可能是单个结果集,其中包含计算的IsActive
列:
SELECT
UserName,
( CASE WHEN UserName NOT LIKE '%[0-9]' THEN 1 ELSE 0 END ) AS IsActive
FROM
Users
...在任何消费代码中处理起来会相当容易。
答案 1 :(得分:0)
这种保存数据的格式非常有用,在这一列中保存用户名和用户的其他保留状态
select username,
case username
when '%[0-9]% then inactive
else active
end as user_status
from table_1
username user_status
john active
john123 inactive