【问题标题】:SQL computed column based on a special character on another column基于另一列上的特殊字符的 SQL 计算列
【发布时间】:2019-10-21 13:53:25
【问题描述】:

我根本不擅长 SQL,几乎不知道如何将基本脚本作为删除、删除、添加等糟糕的操作。

我有大约 12 列的数据,我想添加一个计算列,该列将根据特殊字符出现在另一列中而改变。

让我们说

A                 C   
Money$            YES
Money             NO

就是这个想法,我想创建一个列 C,如果列 A 上有 $ 符号,它会说是。这可能吗?我假设您可以使用类似于 if 条件的东西,但我没有使用 SQL 脚本的经验。

【问题讨论】:

    标签: sql sql-server calculated-columns


    【解决方案1】:

    您将使用case 表达式和like

    select t.*,
           (case when a like '%$%' then 'YES' else 'NO' end) as c
    from t;
    

    以下只是评论。

    这是非常基本的 SQL 语法。我建议您花一些时间来学习基础知识。边做边学是一种不错的方法——假设您有一些基础知识可以建立。否则,您很可能会花费大量时间来学习一些东西,而您可能无法学到最好的做事方式。

    【讨论】:

    • 我将如何使用你的?选择 t.*,我会用其他东西替换 t 吗?没关系,我在修改你的,这是解决我问题的代码:) 它真的很简单,我会继续阅读更多关于这类函数的内容,如果你能推荐我一个好的资源,请告诉我
    【解决方案2】:

    是的,这是可能的。您必须用适当的对象名称替换大括号 ({}) 中的部分。我也使用bit 而不是'Yes'/'No';因为这似乎更适合:

    ALTER TABLE {YourTable} ADD {New Column Name} AS CONVERT(bit, CASE WHEN {Column} LIKE '%$%' THEN 1 ELSE 0 END) PERSISTED;
    

    请注意,如果列 ({Column}) 的值为 NULL,而不是 NULL,这将返回 0;不确定这是否是正确的逻辑,但这应该足以让球滚动起来。如果没有,请阅读CASE 表达式和NULL 逻辑。

    【讨论】:

    • Msg 102,级别 15,状态 1,第 2 行 '{' 附近的语法不正确。是我使用它时得到的。不知道为什么
    • @VictorJMytre.... “您必须将大括号 ({}) 中的部分替换为适当的对象名称。” 您尚未替换这些部分在大括号中。
    • 我做了,但错误的是,您的回答也有效。由于有点比另一个复杂一点,但我会将它用于另一个计算列:) 非常感谢!
    • 因此,例如 @VictorJMytre ,而不是 {YourTable} 您将输入 Your Tableactual name
    • 是的,我理解那部分,只是我忘记了我的表的前缀,它导致了问题。快速提问,我的计算列没有显示在诸如 power bi 之类的外部查询中,有没有办法让数据库上的这些列显示外部查询?
    【解决方案3】:

    正则表达式匹配可以帮助您找出字符串中是否存在您认为是特殊字符的字符:

    SELECT
            ColumnA
        ,   SUBSTRING(ColumnA, PATINDEX('%[^ a-zA-Z0-9]%', ColumnA), 1) AS FirstSpecialChar
    WHERE
        ColumnA LIKE '%[^ a-zA-Z0-9]%'
    ;
    

    [^ a-zA-Z0-9] 模式将匹配任何不是数字、空格或字母字符的字符(注意字符组开头的 ^ - 这意味着 NOT

    【讨论】:

      【解决方案4】:

      您可以使用正则表达式检查 EX 列中的任何特殊字符: SQL 服务器

      SELECT CASE WHEN 'ABCD$' Like '%[^a-zA-Z0-9]%' 1 THEN 'YES' ELSE 'NO' END 作为结果

      MYSQL

      SELECT CASE WHEN 'ABCD$' REGEXP '[^a-zA-Z0-9]' = 1 THEN 'YES' ELSE 'NO' END 作为结果

      正则表达式可以根据需要更改

      正则表达式'[^[:alnum:]]'

      【讨论】:

      • “你可以使用正则表达式” 除了你不能,因为SQL Server不支持正则表达式,而且T-SQL方言中没有REGEXP函数。
      • 正则表达式可以被like替换
      • 这并没有改变我的陈述“SQL Server 不支持正则表达式”。它只支持基本的模式匹配。
      • 所以您只想更改 $,如果是,那么您可以在 '%$%' 上写上类似的内容,仅此而已。如果要删除所有特殊字符,则必须添加所有特殊字符。
      猜你喜欢
      • 2010-12-23
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2022-01-15
      • 2013-05-04
      相关资源
      最近更新 更多