如果我有一个包含
的列hello;world;how;are;you;
如何编写sql命令来删除“hello world”或“你好吗”。
感谢
答案 0 :(得分:1)
trojanfoe写了你需要做的正确的数据库设计。如果你无法改变这一点,我可能有办法解决它。 我怀疑这是最快的方法,但您可以获取数据,将其拆分为新的虚拟表,然后删除您需要的内容,您可以在列中再次添加结果。
SQL中没有拆分,所以这里有一个拆分函数(MS SQL,可能需要修改mySQL):
CREATE FUNCTION dbo.fn_Split(@text nvarchar(4000), @delimiter char(1) = ',')
RETURNS @Strings TABLE (
position int IDENTITY PRIMARY KEY,
value nvarchar(4000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
SET @text = RTRIM(LTRIM(@text))
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
有了这个,你可以做这样的事情:
SELECT * FROM dbo.fn_Split(<yourcolumn>,';')
然后,您将内容作为单行提供。 然后,您可以使用WHERE语句(如
)删除项目SELECT * FROM dbo.fn_Split(<yourcolumn>,';') WHERE [value] LIKE '%hello%'
您可能需要编写一个PROCEDURE或一个TABLE / SCALAR FUNCTION来处理您的数据。
所以这不是一个好方法,但是到目前为止我发现的唯一方法:)希望它有所帮助但是。
答案 1 :(得分:0)
如果此列包含您要操作的多个项目,则将它们放入单个列中是架构设计缺陷。
您没有利用数据库的关系特性,您应该将这些项存储在主表的子表中。然后,您将能够在此子表中定义排序(使用单独的列),并且能够更容易地操纵(即SELECT
,DELETE
等)单个元素。
答案 2 :(得分:0)
猜测它是否是遗留数据库结构,无法轻易更改。
顺便说一句,答案是更新字段。由于现在几乎每个数据库引擎都允许您编写存储函数,我想这是一个很好的解决方案。
使用类似的Oracle语法可以起作用:
UPDATE TABLE SET FIELD_NAME = STORED_FUNCTION_MANIPULATING_THE_FIELD(FIELD_NAME) WHERE [where condition]
但在执行查询之前,您应该定义存储的函数。
FUNCTION STORED_FUNCTION_MANIPULATING_THE_FIELD(FIELD_NAME VARCHAR2) RETURN VARCHAR2 IS
BEGIN
-- Do whatever you want on field, then return it.
END STORED_FUNCTION_MANIPULATING_THE_FIELD;
然而,这在概念上是错误的,多个数据值应使用多列以充分利用关系引擎(如前面的答案中所述)。
此致
微米。
答案 3 :(得分:0)
UPDATE tablename SET field=replace(replace(field,'hello;world;',''),';',' ') [WHERE condition]
UPDATE tablename SET field=replace(mid(field,locate('how',field)),';',' ') [WHERE condition]
UPDATE tablename SET field=replace(mid(field,1,locate(';how',field)),';',' ') [WHERE condition]
UPDATE tablename SET field=replace(substring_index(field,';',2),';',' ') [WHERE condition]
(如果在substring_index函数中使用-2,则会得到文本的其他部分。)
其中一个会给你你想要的东西。 substring_index的使用可能是最灵活的方式。