在SQL I中(很遗憾)经常不得不使用“LIKE”条件,因为数据库违反了几乎所有的规范化规则。我现在改变不了。但这与问题无关。
此外,我经常使用诸如WHERE(1,1,2,3,5,8,13,21)中的某些内容之类的条件,以提高SQL语句的可读性和灵活性。
有没有可能在不编写复杂的子选择的情况下将这两者结合起来?
我想要一些像WHERE一样简单的东西('bla%', '%foo%', 'batz%')而不是这样:
WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'
我在这里与SQl Server和Oracle一起工作,但我感兴趣的是,这是否可能在任何RDBMS中。
在T-SQL中,这个选项是有效的,但不是很快:
CREATE FUNCTION FN_LIKE_IN (@PROC NVARCHAR(MAX), @ITENS NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN
--Search an item with LIKE inside a list delimited by "," Vathaire 11/06/2019
DECLARE @ITEM NVARCHAR(MAX)
WHILE CHARINDEX(',', @ITENS) > 0 BEGIN
SET @ITEM = LEFT(@ITENS, CHARINDEX(',', @ITENS) - 1)
--IF @ITEM LIKE @PROC
IF @PROC LIKE @ITEM
RETURN @PROC --@ITEM --1
ELSE
SET @ITENS = STUFF(@ITENS, 1, LEN(@ITEM) + 1, '')
END
IF @PROC LIKE @ITENS RETURN @PROC --@ITEM --1
RETURN NULL --0
END
查询:
SELECT * FROM SYS.PROCEDURES
WHERE DBO.FN_LIKE_IN(NAME, 'PRC%,SP%') IS NOT NULL
在T-SQL中,这个选项是有效的,但不是很快:
CREATE FUNCTION FN_LIKE_IN (@PROC NVARCHAR(MAX), @ITENS NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN
--Search an item with LIKE inside a list delimited by "," Vathaire 11/06/2019
DECLARE @ITEM NVARCHAR(MAX)
WHILE CHARINDEX(',', @ITENS) > 0 BEGIN
SET @ITEM = LEFT(@ITENS, CHARINDEX(',', @ITENS) - 1)
--IF @ITEM LIKE @PROC
IF @PROC LIKE @ITEM
RETURN @PROC --@ITEM --1
ELSE
SET @ITENS = STUFF(@ITENS, 1, LEN(@ITEM) + 1, '')
END
IF @PROC LIKE @ITENS RETURN @PROC --@ITEM --1
RETURN NULL --0
END
查询:
SELECT * FROM SYS.PROCEDURES
WHERE DBO.FN_LIKE_IN(NAME, 'PRC%,SP%') IS NOT NULL
你被困在
WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'
除非你填充一个临时表(包括数据中的通配符)并像这样连接:
FROM YourTable y
INNER JOIN YourTempTable t On y.something LIKE t.something
试试(使用SQL Server语法):
declare @x table (x varchar(10))
declare @y table (y varchar(10))
insert @x values ('abcdefg')
insert @x values ('abc')
insert @x values ('mnop')
insert @y values ('%abc%')
insert @y values ('%b%')
select distinct *
FROM @x x
WHERE x.x LIKE '%abc%'
or x.x LIKE '%b%'
select distinct x.*
FROM @x x
INNER JOIN @y y On x.x LIKE y.y
输出:
x
----------
abcdefg
abc
(2 row(s) affected)
x
----------
abc
abcdefg
(2 row(s) affected)