我需要编写一个sql查询来过滤掉字段中空格数不断变化的行。例如,我有这个查询
SELECT MEMO_SYSTEM_TXT
FROM [EE].[dbo].[EE_Billing_Memo]
where MEMO_SYSTEM_TXT is not null and MEMO_SYSTEM_TXT <> '' and MEMO_SYSTEM_TXT <> ' '
我发现字段MEMO_SYSTEM_TXT可能包含不同数量的空格,因此我的限制是不够的。任何人都有一个强大的cluase可以一次过滤所有空间?
答案 0 :(得分:4)
SELECT
MEMO_SYSTEM_TXT
FROM [EE].[dbo].[EE_Billing_Memo]
WHERE
MEMO_SYSTEM_TXT IS NOT NULL
AND LTRIM(MEMO_SYSTEM_TXT) <> ''
答案 1 :(得分:3)
几个空格总是等于空字符串
SELECT 1
WHERE
'a' = 'a ' and
'a' = 'a ' and
'' = ' ' and
cast('' as char(1)) = cast(' ' as char(5))
因为它们全部相等而返回1
所以你要做的就是:
SELECT MEMO_SYSTEM_TXT
FROM [EE].[dbo].[EE_Billing_Memo]
WHERE MEMO_SYSTEM_TXT is not null and MEMO_SYSTEM_TXT <> ''
答案 2 :(得分:1)
最简单的方法是用空字符串替换空格,并检查字符串长度,即表达你的条件:
AND LEN(REPLACE(MEMO_SYSTEM_TXT , ' ', '')) = 0
这将找到由任意数量的空格组成的所有空字符串和字符串:
'', ' ', ' ', ' '...
所以这可以取代原来的表达式:
and MEMO_SYSTEM_TXT <> '' and MEMO_SYSTEM_TXT <> ' '
以及您必须包含的所有剩余MEMO_SYSTEM_TXT <> ' '
。
答案 3 :(得分:0)
这会过滤掉MEMO_SYSTEM_TXT
,它们不是空字符串或空字符串,并且不包含任何空格。
SELECT MEMO_SYSTEM_TXT
FROM [EE].[dbo].[EE_Billing_Memo]
WHERE
MEMO_SYSTEM_TXT IS NOT NULL
AND MEMO_SYSTEM_TXT <> ''
AND MEMO_SYSTEM_TXT NOT LIKE '% %'
答案 4 :(得分:0)
您可以使用类似RegEx的条件,但supported functionality在本机T-SQL中非常有限。
SELECT
MEMO_SYSTEM_TXT
FROM
[EE].[dbo].[EE_Billing_Memo]
WHERE
MEMO_SYSTEM_TXT LIKE N'%[^ ]%'
示例值
SELECT
*
FROM
(VALUES (''), (' '), (' '), ('x y'), (' x'), ('x ')) AS A(txt)
WHERE
txt LIKE N'%[^ ]%'
如果这不是按时查询,请更新存储在列中的数据,更新所有记录以删除所有仅空格值(将它们更新为NULL或空字符串)。
您可以为列添加CHECK
约束,以防止新创建的“空”记录。
将所有'empyt'值更新为NULL
UPDATE
[EE].[dbo].[EE_Billing_Memo]
SET
MEMO_SYSTEM_TXT = NULL
WHERE
MEMO_SYSTEM_TXT LIKE N'%[^ ]%'
要添加的CHECK
约束:
CONSTRAINT CK_PreventEmpty_MEMO_SYSTEM_TXT
CHECK MEMO_SYSTEM_TXT LIKE N'%[^ ]%'
另一种解决方案是添加INSTEAD OF
触发器(INSERT
和UPDATE
)以防止MEMO_SYSTEM_TXT
中的“空”值,或者您可以创建一个索引视图不包含'空'文本。
答案 5 :(得分:0)
尝试以下代码:
SELECT MEMO_SYSTEM_TXT
FROM [EE].[dbo].[EE_Billing_Memo]
WHERE MEMO_SYSTEM_TXT IS NOT NULL AND ASCII(REPLACE(MEMO_SYSTEM_TXT, ' ', '')) != 10
用''
替换空格后,仅剩下一个''
,''
的ascii码为10
答案 6 :(得分:-1)
您可以在SQL中使用正则表达式。找到与要检测的内容匹配的正则表达式,并将其直接应用于WHERE子句中。