SQL Select语句将值分成两列

时间:2017-01-17 07:37:03

标签: sql

我在Username列中有字符串值。 示例用户名:

USERNAME
--------
foobar123
john
smith23
steve
peter
king213

末尾带有数字的用户名表示这些用户不再处于活动状态。我想在一个Select语句中将这些用户名分为两列ActiveNot_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,但我不知道如何获取用户名值。

2 个答案:

答案 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