拆分列并选择值

时间:2018-03-25 09:04:27

标签: u-sql

我的输入数据中有一列,其中包含以逗号分隔的多个值。示例:

[my_list] ' 1,123,233,400,500'

我想选择[my_list]包含的行' 123'。

我试过的是:

新的SQL.ARRAY(my_list.Split(','))==' 123'

' 123'在my_list.Split(','))

但没有成功。我真的不确定如何解决它。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

尝试此查询:

SELECT *
FROM yourTable
WHERE
    String.Concat(",", String.Concat([my_list], ",")) LIKE "%,123,%";

此技巧将,1,123,233,400,500,%,123,%进行比较,即检查任何位置(开始,中间或结束)中的123

虽然此选项可以解决您的直接问题,但更好的长期解决方案是不在您的SQL表中存储CSV数据。

答案 1 :(得分:1)

@table = 
SELECT * FROM 
    ( VALUES
    (1, "1,123,233,400,500"),
    (2, "123,233,400,500"),
    (3, "1,123"),
    (4, "1,233,400,500"),
    (5, "1,   123   ,233,400,500")
    ) AS T(id, my_list);

@result1 =
    SELECT * FROM @table
    WHERE my_list LIKE "%123%";

@result2 =
    SELECT * FROM @table
    WHERE new SQL.ARRAY<string>(my_list.Replace(" ", "").Split(',')).Contains("123");

答案 2 :(得分:1)

只是为了它的乐趣,这是使用CROSS APPLY EXPLODE解决相同请求的另一种方法:

@table = 
  SELECT * FROM 
    ( VALUES
      (1, "1,123,233,400,500"),
      (2, "123,233,400,500"),
      (3, "1,123"),
      (4, "1,233,400,500"),
      (5, "1,   123   ,233,123,500")
    ) AS T(id, my_list);

@result =
  SELECT DISTINCT id, my_list 
  FROM @table CROSS APPLY EXPLODE (my_list.Split(new char[] {',', ' '})) AS x(item)
  WHERE item == "123";

OUTPUT @result TO "/output/result.csv" USING Outputters.Csv(outputHeader:true);