2015-09-05 73 views
0

查找数组值我有2个字符串不是有序例如orange不总是在第一线或其他值第二位。在另一个阵列

apple, orange, water 

water, juice, orange, something, apple 

我想要如果所有的第一行值都存在于第二行。

  • 我试过REGEXP 'apple|orange|water'|orand,它给我,如果真的,除非我写的每一个可能的排序one of them存在有不all of them

  • 我也试过IN()但它需要3之类的语句:

    ... 'apple' IN('water', 'juice', 'orange', 'something', 'apple') AND 
        'orange' IN('water', 'juice', 'orange', 'something', 'apple') AND 
        'water' IN('water', 'juice', 'orange', 'something', 'apple') ... 
    
  • 也试过LIKE,但它应该像IN()中进行查询。

  • 毕竟我试过Match() Against(),但它在join声明中不起作用。看看这个:

    SELECT * 
    FROM t1 
    INNER JOIN t2 
    ON 
        t1.sth = t2.sth AND 
        MATCH(t1.sthelse) AGAINST(t2.sthelse IN BOOLEAN MODE) 
    

    这里有2个问题。首先,它不工作,在加入(也可用于where但第二个问题没有解决其次,AGAINST应该是字符串:? - 随着Concat()我不能这样做存在错误的伎俩

我想做到这一点并不在这些困难的途径,也为我的目的,我应该与MySQL做和处理这些数据无法访问PHP。 +我可以分裂性格改变任何东西。

任何想法...赞赏。

+0

我认为'IN()'方法(每个第一阵列中的条目一个这样的操作)是最好的解决方案。 – eggyal

+0

查看FIND_IN_SET()函数。 –

+0

@RickJames我认为它就像'IN()'为我的目的。 – MaHDyfo

回答

0

我的Linux VM仍在加载所以下面的代码是在MS SQL测试。模式匹配可能会中断。例如,你的第一个字符串是“苹果,橙,水”,你的第二个字符串是“苹果派,橙派,水瓶”。

这是将字符串转换为表变量的很好的参考。

​​

DECLARE @FirstLineValues varchar(max), @SecondLineValues varchar(max) 
DECLARE @eachValue VARCHAR(20) 
SELECT @FirstLineValues = 'abc,3,3,5,6,3', @SecondLineValues = 'abc,2,3,4,5,6,7,8,9' 
DECLARE @tblFirstLineValues TABLE(Value varchar(10)) 
DECLARE @tblSecondLineValues Table (value varchar(10)) 
------------------------------------------------------------------------- 
DECLARE @ind int, @allExist bit 
SET @ind = CHARINDEX(',',@FirstLineValues) 
WHILE @ind > 0 
BEGIN 
     SET @eachValue = SUBSTRING(@FirstLineValues, 1, @ind-1) 
     SET @FirstLineValues = SUBSTRING(@FirstLineValues, @ind+1, LEN(@FirstLineValues)[email protected]) 
     INSERT INTO @tblFirstLineValues values (@eachValue) 
     SET @ind = CharIndex(',', @FirstLineValues) 
END 
SET @eachValue = @FirstLineValues 
INSERT INTO @tblFirstLineValues values (@eachValue) 
------------------------------------------------------------------------- 
SET @ind = CHARINDEX(',',@SecondLineValues) 
WHILE @ind > 0 
BEGIN 
     SET @eachValue = SUBSTRING(@SecondLineValues,1,@ind-1) 
     SET @SecondLineValues = SUBSTRING(@SecondLineValues,@ind+1,LEN(@SecondLineValues)[email protected]) 
     INSERT INTO @tblSecondLineValues values (@eachValue) 
     SET @ind = CharIndex(',',@SecondLineValues) 
END 
SET @eachValue = @SecondLineValues 
INSERT INTO @tblSecondLineValues values (@eachValue) 
------------------------------------------------------------------------- 
SELECT @allExist = IIF(count(*) = 0, 1, 0) 
FROM @tblFirstLineValues flv 
LEFT OUTER JOIN @tblSecondLineValues slv ON flv.value = slv.value 
WHERE slv.value IS NULL 
------------------------------------------------------------------------- 
select @allExist 'All first line values exist in second line' 
+0

谢谢你的回答。我可以在加入声明中做到吗? (请参阅问题更新 - 第4次尝试)。你可以把它转换成一个简单的代码,我可以理解发生了什么。它是否通过遍历所有行来完成这项工作?或者它可以通过一次性完成所有事情?看,我想查找2个表中的匹配项,并且无法遍历表1中的单行所有表2行。我想知道mysql的正则表达式是否更好,并且可以在那里执行(?= apple | orange | water),但是它不支持:( – MaHDyfo