2016-09-12 47 views
0

我遇到一個SQL查詢問題,它必須與包含所有用戶用戶名的列的用戶名相匹配。SQL與雙管道級聯一樣

所以列將包含類似:

|USER1|USER2|USER3|USER11|USER22| 

用戶對左邊和右邊的管道,以防止「USER1」進行匹配,即使在「USER11」。

我的查詢是

SELECT * FROM myTable WHERE CONCATUSERS LIKE ('%|' || 'USER1' || '|%') 

注意,USER1查詢是從我們的代碼所產生的變動,所以我必須保持串聯語法,我必須使用標準的語法太(代碼將在運行mysql ,SQLServer的等。

那麼,什麼是在LIKE子句中連接字符串的正確方法是什麼?

+1

MySQL和SQL服務器有字符串連接不同的運營商 - 尤其是你在找哪一個? –

+0

我必須使用一個適用於兩者,我發現雙管應該是標準的 –

+1

不幸的是,儘管它是一個SQL「標準」,它不支持在SQL Server中。它在MySQL中受支持,但必須明確啓用。 SQL 2012及更高版本確實支持CONCAT,因此如果您可以限制爲該版本,那麼您可以同時支持這兩個版本。 –

回答

0

使用CONCAT。 (可在SQL Server 2012及更高版本上使用)

它具有隱式轉換類型以將值添加到字符串的好處。它不僅僅可用於Sql Server和MySql。

SELECT * FROM myTable WHERE CONCATUSERS LIKE CONCAT('%|','USER1','|%'); 

請注意,如果其中一個連接值爲NULL,則結果將爲NULL。但不是在Sql Server上。

這只是Oracle固執,只允許2個值的函數。
所以如果SQL需要對MySQL的,最近的SQL Server和Oracle運行不變,那麼這應該工作:

SELECT * FROM myTable WHERE CONCATUSERS LIKE CONCAT(CONCAT('%|','USER1'),'|%'); 
+0

我會注意到'CONCAT'只支持SQL Server 2012及更高版本。 –

+0

感謝您的評論。指出。是的,當標籤不是版本特定的時候,應該總是添加這樣的信息。 – LukStorms

1

MySQL使用雙管的CONCAT。SQL Server,您可以使用+。

SELECT * 
FROM myTable 
WHERE CONCATUSERS LIKE ('%' + '|user1|' + '%') 
+0

問題是我應該使用標準的語法,而不是兩個不同的語法。 –

0

你可以用CONCAT功能去。 由於它支持SQL和MySQL的

SELECT * 
FROM xpat 
WHERE plname LIKE concat('%' ,'|user1|' ,'%'); 
+1

我會注意到'CONCAT'只支持SQL Server 2012及更高版本。 –

+0

user1是一個變量,這不起作用。如果這個工作,字符串常量''%| user1 |%''可以工作。 – Hogan