如何对字符串中的ID运行查询?

时间:2010-10-01 10:50:37

标签: sql string select

我在这一栏中有一张表A:

  IDS(VARCHAR)
  1|56|23

我需要运行此查询:

  select TEST from TEXTS where ID in ( select IDS from A where A.ID = xxx )

TEXTS.IDINTEGER。如何将字符串A.IDS拆分为多个用于连接的整数?

必须适用于MySQL和Oracle。 SQL99首选。

1 个答案:

答案 0 :(得分:6)

首先,您不应该在列中存储这样的数据。你应该把它拆分成一个单独的表,然后你会有一个正常的连接,而不是这个问题。

话虽如此,你要做的是以下几点:

  1. 将数字转换为字符串
  2. 使用|(您的分隔符)字符填充它,然后填充它(之后我会告诉您原因)
  3. 之前和之后使用相同的分隔符填充您正在查找的文本
  4. 在其上LIKE
  5. 这会慢一点!

    这是执行您想要的SQL(假设所有运算符和函数都在您的SQL方言中工作,您没有说这是什么类型的数据库引擎):

    SELECT
        TEXT   -- assuming this was misspelt?
    FROM
        TEXTS  -- and this as well?
        JOIN A ON
            '|' + A.IDS + '|' LIKE '%|' + CONVERT(TEXTS.ID) + '|%'
    

    你之前和之后需要用分隔符填充两个的原因是:如果你正在寻找数字5怎么办?您需要确保它不会意外地符合56数字,因为它包含数字。

    基本上,我们会这样做:

    ... '|1|56|23|' LIKE '%|56|%'
    

    如果在A中只有一行,如果你这样做可能会跑得更快(但我不确定,你需要测量它):

    SELECT
        TEXT   -- assuming this was misspelt?
    FROM
        TEXTS  -- and this as well?
    WHERE
        (SELECT '|' + IDS + '|' FROM A) LIKE '%|' + CONVERT(TEXTS.ID) + '|%'
    

    如果TEXTS表中有很多行,那么首先从A表中检索值,添加代码以生成相应的SQL是值得的。 IN并使用它代替:

    SELECT
        TEXT   -- assuming this was misspelt?
    FROM
        TEXTS  -- and this as well?
    WHERE
        ID IN (1, 56, 23)
    

    这将运行得更快,因为它现在可以在此查询中使用索引。

    如果您将A.ID作为列,并将值作为单独的行,则以下是执行查询的方式:

    SELECT
        TEXT   -- assuming this was misspelt?
    FROM
        TEXTS  -- and this as well?
        INNER JOIN A ON TEXTS.ID = A.ID
    

    这将比前一个运行稍慢,但在前一个版本中,您必须首先检索A.IDS,构建查询,并冒险生成必须编译的新执行计划。 / p>