【问题标题】:SQL bypass REPLACE by CASE statementSQL 绕过 REPLACE by CASE 语句
【发布时间】:2015-08-26 17:25:00
【问题描述】:

我有一些记录包含空白行的数据(=没有空格,没有 NULL)。例如:

LOCALE
en-es
en-uk

uk-uk

当我想选择那个空白行时,很容易:

SELECT LOCALE
FROM ABC
WHERE LOCALE = ''

但是当我尝试如下替换它时,它不起作用,结果仍然是空白行:

SELECT REPLACE(LOCALE,'','WHY') AS 'LOCALE'
FROM ABC
WHERE LOCALE = ''

但是如果我用CASE 语句绕过它,它会起作用:

SELECT CASE
       WHEN LOCALE LIKE '' THEN 'WHY'
       ELSE LOCALE
       END AS 'LOCALE'
FROM ABC
WHERE LOCALE = ''

这里有什么问题?为什么REPLACE 功能不起作用?

【问题讨论】:

  • 不能替换空字符串。
  • @wewestthemenace 我认为 OP 已经得到了那部分,问题是为什么它不能完成......
  • 试试这个 SELECT REPLACE(' ',' ','WHY') AS 'LOCALE' is space is there then you can replace it .空刺你不能
  • REPLACE 是“在第一个字符串中查找第二个字符串的每个出现并用第三个字符串替换它”而不是“比较第一个和第二个字符串,如果它们相等,则返回第三个字符串,否则返回第一个字符串"
  • @ZoharPeled - 替换空字符串很麻烦,因为它们可能太多了。字符串AB中的字符AB之间出现了多少个空字符串? (答案可以是 0、1、99 或任何其他你想得到的正数)

标签: sql-server tsql replace case sql-server-2014


【解决方案1】:

很明显'' 表示空白(非空),它也存在于两个连续的字母之间。 (因为它是空白的)

所以 Sql 不能继续用你想要的字符串替换每个字母之间的 that 空白。这就是为什么你不能替换''

检查这个查询

SELECT ISNULL(NULLIF(LOCALE, ''),'WHY') AS [LOCALE]
FROM ABC
WHERE LOCALE = ''

【讨论】:

  • 这不是不可能,只是sql server开发者不允许的事情……
  • 我投票赞成你的答案,因为你是目前唯一理解这个问题的人:-)
  • 只需验证您发布的答案,因为当我运行它时它只显示 W 而不是 'WHY'
  • 您的列在表ABC 中的长度是否为1
【解决方案2】:

您的替换功能不会替换空格。 试试这个

SELECT REPLACE(isnull(ITEM,''),' ','WHY') AS 'LOCALE'
FROM Table1
WHERE ITEM = ''

【讨论】:

    【解决方案3】:

    我建议你使用NULLIF将空字符串转换为NULL,之后使用COALESCEANSI标准 em>) 将NULL 替换为您想要的任何值,如下所示:

    SELECT COALESCE(NULLIF(LOCALE, ''),'WHY') AS 'LOCALE' 
    FROM ABC 
    WHERE LOCALE = ''
    

    【讨论】:

      【解决方案4】:

      这只是一种替代方法 试试下面的方法

      select COALESCE(NULLIF('',''), 'WHY' AS 'LOCALE'
      FROM ABC
      WHERE LOCALE = ''
      

      【讨论】:

        猜你喜欢
        • 2020-10-26
        • 2020-04-01
        • 2013-11-19
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        相关资源
        最近更新 更多