我正在为一个没有正确清理其部分表单数据的客户的网站工作。特别是,他们没有做任何事情来解释从textareas收到的换行符。所以,在数百个db行中有\r\n
和\r\n\r\n
以及\r\n\r\n\r\n
......你明白了。我需要以某种方式仅提取具有\r\n
的行来清理数据。我不能为我的生活,建立一个选择这些行的查询!我意识到我必须以某种方式逃避斜线,但我没有成功。
我尝试过以下方法:
SELECT Id,Description FROM lakes WHERE Description LIKE '%\r\n%';
SELECT Id,Description FROM lakes WHERE Description LIKE '%\\r\\n%';
SELECT Id,Description FROM lakes WHERE Description LIKE '%\\\r\\\n%';
SELECT Id,Description FROM lakes WHERE Description LIKE '%\\\\r\\\\n%';
我当然可以继续添加斜杠,但我觉得如果4个斜杠没有做到这一点,我可能会遗漏一些重要的东西。
这些查询中的每一个都返回结果,但结果中没有一个是\r\n
中的结果。最后一个查询(带有4个斜杠)确实返回了2行,它们确实有\r\n
,还有138行没有。
此外,因为我知道有人会提到它,我知道nl2br()
。由于某种原因,它不使用表中的原始数据。现在,我很高兴能够拉出这些行并清理它们。
提前致谢!
玩笑
这是SQL真正不擅长的一个例子。
使用PHP编写一个返回所有行(或一次20行)的简单脚本,并使用php正则表达式查找您所追求的行。然后对数据执行任何操作并更新数据库。 SQL不够复杂,无法做到你想要的,在PHP中更容易做。
在Postgresql中你可以使用:
SELECT Id,Description FROM lakes WHERE Description LIKE E'%\r\n%';
见https://www.postgresql.org/docs/current/sql-syntax-lexical.html:
PostgreSQL还接受“转义”字符串常量,它是SQL标准的扩展。通过在开始单引号之前写入字母E(大写或小写)来指定转义字符串常量,例如E'foo'。 (当在行之间继续转义字符串常量时,仅在第一个开始引号之前写入E.)在转义字符串中,反斜杠字符()开始一个类似C的反斜杠转义序列,其中反斜杠和后续字符的组合(s )表示特殊的字节值