如何優雅地拼SQL的in子句

2022-04-05 04:55:43 字數 1380 閱讀 1562

in 語句如何優雅拼接 name list 

在專案中, 經常會碰到這樣的場景, 要按 name  list 獲取這些name對應的記錄,  比如要獲取 king,jones,ford 對應的記錄,  顯然想到的是使用 in 子句, 

比如:  select id from employee where emp_name in ('king','jones','ford') 

有幾種做法:

1. 硬拼 sql的方法,  比如  sql =   "select id from employee where emp_name in ( "+ "  'king','jones','ford' " +")" 

問題是**可讀性非常差, 需要先將 name list 打散, 然後為每個 name先包乙個單引號, 然後再套乙個迴圈, 構建完整的 in 子句. 

2. 使用 connect by  的寫法(sql server 對應的有 split table function)

select id

from employee

where emp_name in

(select regexp_substr('king,jones,ford'

,'[^,]+'

,1,level) emp_name

from dual

connect by regexp_substr('king,jones,ford'

,'[^,]+'

,1,level) is not null);

貌似**很長,  但可讀性非常好, 只要傳兩次 name list 即可.   不需要打散name list,  不需要為單個name包單引號, 不需要使用迴圈重新構建乙個帶單引號的 name list. 

3. 使用 

select id

from employee

where emp_name in table(split('king,jones,ford',','))

結論, 推薦使用第2和第3種寫法. 

like 如何優雅拼接 name list 

in 子句可以將多個候選條件集中在一起, like 操作符沒有同樣的語法, 但我們可以使用正規表示式達到類似的效果. 

select id from employee where emp_name  regexp_like (emp_name '^king|jones|ford')

等同於

select id from employee where emp_name  like 'king%'

or emp_name  like 'jones%'

or emp_name  like 'ford%'

如何優雅地寫部落格

如何優雅地寫部落格 現在寫部落格面臨著幾個問題 編寫麻煩,大部分的部落格編輯器都很爛,csdn和等等。維護麻煩,維護多個部落格的資料同步很麻煩。歷史檢視,大部分部落格編寫都不能檢視之前的歷史資料。用github做部落格倉庫,將資料都寫在github上,這樣可以隨時檢視一年前的部落格資料,方便在原文件...

如何優雅地書寫JavaScript

這篇文章包含了幾乎所有關於提高 質量的內容,尤其是在構建大型應用程式時。主要包括四個部分 本主題僅涉及原生js,關於框架 比如react和vue 的內容會在以後的文章中展現。我想你們大多數人之前都聽說過solid,也就是物件導向設計裡的solid原則。這些原則基於物件導向設計,所以可能不適合其他程式...

如何優雅地關閉SparkStreaming

how to shutdown a spark streaming job gracefully 17 02 02 01 31 35 info streaming.streamingcontext invoking stop stopgracefully true from shutdown hoo...