Альтернативные SQL способы поиска нескольких элементов известных идентификаторов?

Для линейного решения вы можете использовать алгоритм Манахера. Существует еще один алгоритм, называемый алгоритмом Гусфилда, а ниже - код в java:

public class Solution {  
    char[] temp;   
    public int match(int a, int b,int len){   
        int i = 0;   
        while (a-i>=0 && b+i R)  
            {  
                z[i] = match(i, i,len);  
                L = i;  
                R = i + z[i] - 1;  
            }  
            else if (z[ii] == n)  
            {  
                z[i] = n + match(i-n, i+n,len);  
                L = i;  
                R = i + z[i] - 1;  
            }  
            else  
            {  
                z[i] = (z[ii]<= n)? z[ii]:n;  
            }   
        }  

        int n = 0, p = 0;  
        for (int i=0; i n)  
                n = z[p = i];  

        StringBuilder result=new StringBuilder();  
        for (int i=p-z[p]+1; i<=p+z[p]-1; ++i)  
            if(temp[i]!='.')  
                result.append(String.valueOf(temp[i]));  

        return result.toString();  
    }  
}  

. Вы можете найти больше о других решениях, таких как лучшее решение O (n ^ 2) или алгоритм Манахера из мой собственный блог .

13
задан Andy K 30 November 2017 в 14:21
поделиться

8 ответов

SELECT * FROM some_table WHERE ID IN ('1001', '1002', '1003')

и если ваши известные идентификаторы взяты из другой таблицы

SELECT * FROM some_table WHERE ID IN (
    SELECT KnownID FROM some_other_table WHERE someCondition 
)
23
ответ дан 1 December 2019 в 19:23
поделиться

Первый (наивный) вариант:

SELECT * FROM some_table WHERE id IN ('1001', '2002', '3003' ... )

Однако мы должны быть в состоянии добиться большего. IN очень плохо, когда у вас много предметов, и вы упомянули сотни таких идентификаторов. Что их создает? Откуда они? Можете ли вы написать запрос, который возвращает этот список? Если так:

SELECT *
FROM some_table 
INNER JOIN ( your query here) filter ON some_table.id=filter.id
8
ответ дан 1 December 2019 в 19:23
поделиться
3
ответ дан 1 December 2019 в 19:23
поделиться

ИЛИ, как известно, медлительны в SQL.

Ваш вопрос не конкретичен, но в зависимости от ваших требований и ограничений я бы составил справочную таблицу с вашими идентификаторами и использовал предикат EXISTS:

select t.id from some_table t 
where EXISTS (select * from lookup_table l where t.id = l.id)
2
ответ дан 1 December 2019 в 19:23
поделиться

Для фиксированного набора идентификаторов вы можете сделать:

SELECT * FROM some_table WHERE id IN (1001, 2002, 3003);

Для набора, который меняется каждый раз, вы можете захотеть создать таблицу для их хранения и затем выполнить запрос:

SELECT * FROM some_table WHERE id IN 
  (SELECT id FROM selected_ids WHERE key=123);

Другой подход заключается в использовании коллекций - синтаксис для этого будет зависеть от вашей СУБД.

Наконец, всегда есть такой «грязный» подход:

SELECT * FROM some_table WHERE '|1001|2002|3003|' LIKE '%|' || id || '|%';
0
ответ дан 1 December 2019 в 19:23
поделиться

Самый простой способ сделать это - использовать свойство tag для pickerView. Я обычно определяю их в заголовке для удобства чтения. Вы можете установить тег в Интерфейсном Разработчике или в коде.

#define kPickerOne 0
#define kPickerTwo 1

Затем в вашем файле реализации ...

0
ответ дан 1 December 2019 в 19:23
поделиться

У нас есть похожая проблема в приложении, написанном для MS SQL Server 7. Хотя мне не нравится используемое решение, мы мы не знаем ничего лучшего ...

Насколько мне известно, в 2008 году существуют «лучшие» решения, но у нас есть нулевые клиенты, использующие это:)


Мы создали пользовательскую функцию с табличным значением, которая принимает запятую с разделителями. строка идентификаторов и возвращает таблицу идентификаторов. SQL тогда читается достаточно хорошо, и ни один из них не является динамическим, но все еще есть раздражающие двойные издержки:
1. Клиент объединяет идентификаторы в строку
2. SQL Server анализирует строку для создания таблицы идентификаторов.

Существует множество способов превратить '1,2,3,4,5' в таблицу идентификаторов, но хранимая процедура, использующая функцию, заканчивается выглядит как ...

CREATE PROCEDURE my_road_to_hell @IDs AS VARCHAR(8000)
AS
BEGIN

   SELECT
      *
   FROM
      myTable
   INNER JOIN
      dbo.fn_split_list(@IDs) AS [IDs]
         ON [IDs].id = myTable.id

END
0
ответ дан 1 December 2019 в 19:23
поделиться

Самое быстрое - это поместить идентификаторы в другую таблицу и в JOIN

SELECT some_table.* 
FROM some_table INNER JOIN some_other_table ON some_table.id = some_other_table.id

, где some_other_table будет иметь только одно поле (идентификаторы ) и все значения будут уникальными

0
ответ дан 1 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: