2014-12-28 2 views
0

В предыдущем question мне кажется, что моя проблема зависит от SQLite. Я упростил задачу следующим образом:Подстановочные знаки SQLite в Join

Say У меня есть две таблицы: table1 следующим

Name  | col1 
------------------------ 
Bob  | B1 
Mary Jane| M1 

и table2 следующим образом:

Name  | col2 
------------------------------ 
Bob  | B2 
Mary  | M2 

То, что я хотел бы, чтобы присоединиться к этим вместе получим:

NameA  | NameB |col1| col2 
------------------------------------- 
Bob  | Bob | B1 | B2 
Mary Jane | Mary | M1 | M2 

Использование

SELECT tablea.Name as NameA, tableb.Name as NameB, tablea.col1, tableb.col2 
FROM table1 as tablea 
LEFT JOIN table2 as tableb 
ON tablea.Name LIKE tableb.Name 

я получаю в качестве выходного

 NameA NameB col1 col2 
1  Bob Bob B1 B2 
2 Mary Jane <NA> M1 <NA> 

, который является тем, что я бы ожидать. Теперь, если я использую символы следующим образом:

SELECT tablea.Name as NameA, tableb.Name as NameB, tablea.col1, tableb.col2 
FROM table1 as tablea 
LEFT JOIN table2 as tableb 
ON tablea.Name LIKE '%'+tableb.Name+'%' 

я получаю:

 NameA NameB col1 col2 
1  Bob <NA> B1 <NA> 
2 Mary Jane <NA> M1 <NA> 

Это даже не соответствует записи Боба ?!

Я что-то упустил? Это проблема с SQLite?

Для полноты использования, я использую функцию sqldf с R, которая использует SQLite.

ответ

1

Используйте оператор || для конкатенации строк, а не +

+0

Это действительно работает! Большое спасибо. Я предполагаю, что это стандартный оператор concatenate в SQLite. – Geoff

+0

На самом деле, это стандартный оператор конкатенации во всех диалектах SQL, которые я знаю. Это немного несовместимо с большинством языков программирования, хотя ... – wvdz

+0

Oh. Мой предыдущий вопрос хотя и дал ответы с '+' повсюду. – Geoff

0

Для данных образцов, вам не нужно LEFT JOIN:

SELECT tablea.Name AS NameA, tableb.Name AS NameB, tablea.col1, tableb.col2 
FROM table1 as tablea 
INNER JOIN table2 as tableb 
ON tablea.Name LIKE '%'||tableb.Name||'%'; 

SELECT tablea.Name AS NameA, tableb.Name AS NameB, tablea.col1, tableb.col2 
FROM table1 as tablea 
INNER JOIN table2 as tableb 
ON INSTR(tablea.Name, tableb.Name) > 0; 

Второй версии для потенциального прироста производительности.

SQL Fiddle

Смежные вопросы